han*_*nno 3 c malloc posix memory-management
我用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");
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用mprotect来避免写入我的数组(这是预先计算的正弦/余弦值).这是一个愚蠢的想法吗?
mprotect你可能已经知道,它只能以页面为单位工作.在这种情况下,您正确地将块的开头与页面边界对齐,但您没有做的是确保您的分配延伸到您将要在其中使用的最后一页的末尾.
这意味着您mprotect正在保护数据超过分配结束(直到该页面的末尾),这是下一个malloc调用假定它可以写入的空间.
最简单的解决方法是PAGE_SIZE - 1将malloc呼叫更改为PAGE_SIZE * 2.