3

我需要动态分配一些内存部分,每个部分都有一些保护 - 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
4

2 回答 2

5

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

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

如果 mprotect() 失败,您还应该检查 errno,以了解有关失败原因的更多信息。

于 2013-04-02T22:04:32.653 回答
5

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

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

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

因为这是一个匿名映射,所以没有使用支持文件,所以它的行为很像malloc()在这个意义上。

于 2013-04-02T22:09:33.490 回答