在OS X上,您如何找到当前的内存保护级别?

时间:2012-02-08 17:28:12

标签: c macos memory memory-management

  

可能重复:
  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()来确定页面是否在内核中。但这还不够;我也想要当前的权限集。

有没有未记录的方法吗?

1 个答案:

答案 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;

}