我需要动态分配一些内存部分,每个部分都有一些保护 - 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
mprotect() 更改调用进程的内存页的保护,该内存页包含区间 [addr, addr+len-1] 中的地址范围的任何部分。addr 必须与页面边界对齐
这里的最后一部分很重要。malloc 可能不会仅仅因为您请求页面的大小而为您提供页面对齐的内存,因此您必须分配合适的内存块并对其进行对齐,或者使用例如posix_memalign ()分配页面对齐的内存
如果 mprotect() 失败,您还应该检查 errno,以了解有关失败原因的更多信息。
如果要分配一页内存,正确的选择大概是使用mmap()
void *x = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
请注意,由于您将权限传递给调用,因此您以后真的不需要使用mprotect()
。但是,您可以稍后使用它来更改权限,当然,就像您想在页面只读之前将一些数据加载到页面中一样。您可以稍后使用munmap()
.
因为这是一个匿名映射,所以没有使用支持文件,所以它的行为很像malloc()
在这个意义上。