在使用 mprotect() 保护内存区域后,我第一次调用 malloc() 时遇到段错误。这是执行内存分配保护的代码片段:
#define PAGESIZE 4096
void* paalloc(int size){ // Allocates and aligns memory
int type_size = sizeof(double);
void* p;
p = malloc(type_size*size+PAGESIZE-1);
p = (void*)(((long) p + PAGESIZE-1) & ~(PAGESIZE-1));
return p;
}
void aprotect(int size, void* array){ // Protects memory after values are set
int type_size = sizeof(double);
if (mprotect(array, type_size*size, PROT_READ)) {
perror("Couldn't mprotect");
}
}
我想使用 mprotect 来避免任何内容写入我的数组(这是预先计算的正弦/余弦值)。这是一个愚蠢的想法吗?
最佳答案
mprotect
只能以页面为单位工作,您可能已经知道。在这种情况下,您正确地将 block 的开始与页面边界对齐,但是您没有做的是确保您的分配延伸到您要访问的最后一页的末尾在其中使用。
这意味着您的 mprotect
正在保护分配结束后的数据(一直到该页的末尾),这是下一个 malloc
调用假定的空间它可以写入。
最简单的修复方法是将 malloc
调用中的 PAGE_SIZE - 1
更改为 PAGE_SIZE * 2
。
关于c - mprotect 后 malloc 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687415/