可能重复:
Retrieving the memory map of its own process in 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个内存映射范围,一个是读/执行,一个是只读的,其余是读/写。
我查看了我可以找到的所有手册页和官方API,以获取有关OS X的相同信息,并且到目前为止已经空了。我发现接近的唯一一件事是使用mincore()
来确定页面是否在内核中。但这还不够;我也想要当前的权限集。
有没有未记录的方法吗?
答案 0 :(得分:2)
大多数与VM相关的系统调用都可以在OSX的mach库中找到。
http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_region.html
实际上OSX中的大多数POSIX调用只是适当的Mach 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;
}