保护分配的内存

Ari*_*Ari 3 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
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 5

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

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

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


Fat*_*ror 5

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

void *x = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
Run Code Online (Sandbox Code Playgroud)

请注意,由于您将权限传递到调用中,因此您实际上不需要mprotect()之后使用。但是,您可以稍后使用它来更改权限,当然,例如如果您想在将其设为只读之前将一些数据加载到页面中。您可以稍后使用munmap().

由于这是一个匿名映射,因此不使用任何后备文件,因此它的行为很像malloc()在这个意义上。