在OS X系统中,如何查找当前的内存保护级别?

4
可能会有重复:
在OS X 10.5/10.6中检索其自身进程的内存映射 在OS X上,我可以使用mprotect()请求将特定页面的内存设置为可读、可写或可执行的某种组合。
我想知道如何找出当前的保护级别。例如,在Linux上,我可以使用cat /proc/$$/maps找出相同的信息:
$ cat /proc/$$/maps
00400000-004db000 r-xp 00000000 fb:00 131145                             /bin/bash
006da000-006db000 r--p 000da000 fb:00 131145                             /bin/bash
006db000-006e4000 rw-p 000db000 fb:00 131145                             /bin/bash
006e4000-006ea000 rw-p 00000000 00:00 0 
00df4000-00e55000 rw-p 00000000 00:00 0                                  [heap]
...

我可以看到主可执行文件(bash)有5个内存映射范围,其中一个是读/执行的,一个是只读的,其余都是读/写的。

我查阅了所有能找到的man页面和官方API,但在OS X上没有找到相同的信息。我唯一找到的接近方法是使用mincore()来确定页面是否在核心中。但这还不够,我还想知道当前的权限集合。

是否有任何未公开的方法可以做到这一点?


@diciu,感谢提供链接。是的,我相信这个问题是你提供链接中的一个子集。然而,(我很遗憾没有在问题中写下这一点)我的下一步计划是尝试在iOS上让它工作 - 那里的答案不适用。看起来我需要探索“/usr/include/mach/mach_vm.h”中的“Mach VM region APIs”,正如第二个最受欢迎的答案所暗示的那样。可惜,提供的链接已经失效,头文件也并不明显。 - mpontillo
对于 Mac OS X,开放源代码包括 XNU,因此您应该能够找到您要寻找的内容(http://www.opensource.apple.com/source/xnu/xnu-1699.24.8/)。对于 iOS 来说,情况就不一样了(http://www.opensource.apple.com/release/ios-50/)。 - diciu
由于虚拟内存管理高度依赖于体系结构,因此可能没有适用于MacOS X和iOS的可移植API。 - Daniel Roethlisberger
1个回答

3
大多数与虚拟机有关的系统调用可以在OSX的mach库中找到。
实际上,OSX中大多数POSIX调用只是适当的Mach VM系统调用的包装器。 http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_region.html
#include <stdlib.h>
#include <stdio.h>
#include <mach/mach.h>



int main () {
    void* ptr = malloc(100);

    vm_size_t vmsize;
    vm_address_t address = (vm_address_t)ptr;
    vm_region_basic_info_data_t info;
    mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT;
    memory_object_name_t object;

    kern_return_t status =   vm_region(mach_task_self(), &address, &vmsize, VM_REGION_BASIC_INFO,
                           (vm_region_info_t)&info, &info_count, &object);

    if (status) {
        perror("vm_region");
    }

    printf("Memory protection: %c%c%c  %c%c%c\n",
        info.protection & VM_PROT_READ ? 'r' : '-',
        info.protection & VM_PROT_WRITE ? 'w' : '-',
        info.protection & VM_PROT_EXECUTE ? 'x' : '-',

        info.max_protection & VM_PROT_READ ? 'r' : '-',
        info.max_protection & VM_PROT_WRITE ? 'w' : '-',
        info.max_protection & VM_PROT_EXECUTE ? 'x' : '-'
        );

    return 0;

}

谢谢!看起来这些函数在/usr/lib/system/libsystem_kernel.dylib中可用。不幸的是,它们似乎没有man页面。我猜苹果希望你只使用Objective-C而不去关注这些东西。 =) - mpontillo
哎呀,我无法编译这个示例代码。它说“不能直接链接 /usr/lib/system/libsystem_kernel.dylib。请改为链接总框架 'System.framework'。”尝试使用 -framework System 会出现未定义的符号。有什么想法吗? - mpontillo
在32位模式下似乎链接正常,但在64位模式下失败了。尝试使用-m32。 - Sergey L.
3
在64位模式下,您需要使用vm_region_64函数。 - Chris Devereux

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