我需要动态分配一些内存,每个内存都有一些保护 - 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
答案 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()
非常相似。