在使用 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
您可能已经知道,只能以页面为单位工作。在这种情况下,您正确地将块的开头与页面边界对齐,但您所要做的not要做的就是确保您的分配延伸到您要在其中使用的最后一页的末尾。
这意味着您的mprotect
正在保护分配结束后的数据(一直到该页的末尾),这是下一页的空间malloc
call 假设它可以写入。
最简单的修复方法是更改PAGE_SIZE - 1
in the malloc
拨电至PAGE_SIZE * 2
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)