为什么后面的程序可以写超出当前程序中断?
int main()
{
sbrk(4095);
void *addr = sbrk(0);
printf("%p\n", addr);
*(char*)(addr) = 'a';
return 0;
}
如果将 4095 更改为 4096,则将按预期发生 seg fault。但是4095效果很好。我几乎可以肯定这与页面大小(在我的系统上为 4096)有关。我的猜测是,在 4095 的情况下,sbrk
调用将整个页面设置为可映射,以便在写入发生在该页面的最后一个字节时成功映射该页面。
但是为什么允许写入(它超出了当前的程序中断)?有人可以给出更详细的解释吗?