保护分配的内存

时间:2013-04-02 21:57:50

标签: c memory malloc mprotect

我需要动态分配一些内存,每个内存都有一些保护 - RW或RX。

我尝试按malloc分配内存,但mprotect始终返回-1 Invalid argument

我的示例代码:

void *x = malloc(getpagesize());
mprotect(x, getpagesize(), PROT_READ); // returns -1, it;s sample, so only R, not RW or RX

2 个答案:

答案 0 :(得分:4)

  

mprotect()更改了对调用进程内存的保护   包含区间中地址范围的任何部分的页面   [addr,addr + len-1]。地址          必须与页面边界对齐

这里的最后一部分很重要。 malloc可能不会因为您请求页面大小而给您页面对齐的内存,因此您必须分配合适的内存块并对齐它,或者使用例如分配页面对齐的内存。 posix_memalign()

如果mprotect()失败,你还应该检查errno,以便更多地了解它失败的原因。

答案 1 :(得分:3)

如果要分配一页内存,正确的选择可能是使用mmap()

void *x = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);

请注意,由于您将权限传递给调用,因此您之后不需要使用mprotect()。但是,您可以使用它来更改权限,当然,就像您想要将某些数据加载到页面中之后再将其设置为只读一样。您可以稍后使用munmap()释放它。

由于这是一个匿名地图,因此没有使用任何支持文件,因此在这种意义上它的行为与malloc()非常相似。