2012-02-08 41 views
4

可能重复:
Retrieving the memory map of its own process in OS X 10.5/10.6在OS X上,您如何找出当前的内存保护级别?

在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] 
... 

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

我已经浏览了所有可以在OS X上获得相同信息的手册页和官方API,并且到目前为止已经空了。我唯一发现的就是使用mincore()来判断一个页面是否在内核中。但这还不够;我也想要当前的一组权限。

是否有任何无证的方法来做到这一点?

+0

@diciu,感谢您的链接。是的,我相信这个问题是你所关联问题的一个子集。然而,(我很遗憾没有在这个问题中写这个)我的下一步就是尝试在iOS上使用这个工具 - 并且那里的答案不适用。看起来我需要在'/ usr/include/mach/mach_vm.h'中探索“Mach VM region APIs”,正如第二个最上面的答案所暗示的那样。不幸的是,提供的链接被打破,头文件并没有完全让API变得明显。 – mpontillo 2012-02-15 06:54:49

+0

对于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 2012-02-15 07:15:06

+0

由于虚拟内存管理依赖于高度架构,因此可能无法在MacOS X和iOS上使用可移植的API。 – 2012-03-16 19:32:00

回答

2

大多数与VM相关的系统调用都可以在OSX的mach库中找到。

http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_region.html

其实最POSIX在OSX来电都只是围绕着相应的马赫VM系统调用的包装。

#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; 

} 
+0

谢谢!看起来像'/ usr/lib/system/libsystem_kernel.dylib'中提供了这些功能。可悲的是,它看起来并不像他们的“人”页面。我想苹果希望你只使用Objective-C而不是看这样的事情。 =) – mpontillo 2012-09-27 22:26:20

+0

嗯,我无法编译此示例代码。它说'不能直接与/usr/lib/system/libsystem_kernel.dylib链接。改为与伞架'System.framework'链接。'尝试'-framework System'会产生一个未定义的符号。有任何想法吗? – mpontillo 2012-09-27 22:40:29

+0

它似乎在32位模式下很好地链接,但在我64位模式下失败。尝试使用-m32。 – 2012-09-30 23:48:47