我需要动态分配一些内存,每个内存块都有一定的保护 - 随时可读写或只读。
我尝试使用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
这里最后一部分很重要。malloc可能不会给你一个页面对齐的内存,即使你请求了一个页面的大小,所以你要么分配一个合适大小并且对齐的内存块,或者使用例如posix_memalign()来分配页面对齐的内存。
如果mprotect()失败,你也应该检查errno以了解更多信息。
mmap()
。void *x = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
mprotect()
。当然,您可以稍后使用它来更改权限,例如如果您想在将某些数据加载到页面之前将其设置为只读。您可以使用munmap()
来释放它。malloc()
。
malloc
不能保证对齐,你应该使用类似于posix_memalign
的东西。 - Oliver Charlesworth