mach_vm_region与mach_vm_region_recurse的区别

7

什么是mach_vm_regionmach_vm_region_recurse之间的区别?在哪些情况下会使用它们?

这些函数声明的签名如下:

kern_return_t mach_vm_region
(
    vm_map_t target_task,
    mach_vm_address_t *address,
    mach_vm_size_t *size,
    vm_region_flavor_t flavor,
    vm_region_info_t info,
    mach_msg_type_number_t *infoCnt,
    mach_port_t *object_name
);
kern_return_t mach_vm_region_recurse
(
    vm_map_t target_task,
    mach_vm_address_t *address,
    mach_vm_size_t *size,
    natural_t *nesting_depth,
    vm_region_recurse_info_t info,
    mach_msg_type_number_t *infoCnt
);

如果我想要找到一个进程的所有有效内存地址,应该使用哪个函数?

  1. 查找进程的所有有效内存地址
  2. 查找进程的所有私有内存
1个回答

5
区别在于vm_region_recurse_64版本可让您查看子地图的内容。我不会说我是这个话题的专家,但据我所见,遇到子地图最常见的地方是遍历从dyld缓存映射的框架内存(在x86_64 mac上从SHARED_REGION_BASE_X86_64=0x00007FFF7000000开始)。

vm_region似乎将子地图作为单个区域返回。

我认为子地图中可能存在私有映射。

以下是一个例子:

                       00007fff70000000-00007fff76c00000 vm_region
                       00007fff70000000-00007fff76c00000 vm_region_recurse_64    (depth=0, is_submap == TRUE)
                       00007fff7695b000-00007fff76a00000 vm_region_recurse_64 #1 (depth=1, is_submap == FALSE)
                       00007fff76a00000-00007fff76c00000 vm_region_recurse_64 #2 (depth=1, is_submap == FALSE)

下面是vmstat -interleaved -v的报告:

map                    00007fff70000000-00007fff76c00000 r--/rwx process-only submap
unused split lib       00007fff7695b000-00007fff76999000 system shared library region not used by this process
__DATA                 00007fff76999000-00007fff7699a000 /usr/lib/system/libcompiler_rt.dylib
unused split lib       00007fff7699a000-00007fff769a2000 system shared library region not used by this process
__DATA                 00007fff769a2000-00007fff769a3000 /usr/lib/system/libsystem_notify.dylib
unused split lib       00007fff769a3000-00007fff76a00000 system shared library region not used by this process
unused split lib       00007fff76a00000-00007fff76c00000 system shared library region not used by this process

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接