c - 写超出程序中断

标签 c operating-system

为什么可以在后面的程序中写出超出当前程序中断的地方?

int main()
{
    sbrk(4095);

    void *addr = sbrk(0);
    printf("%p\n", addr);

    *(char*)(addr) = 'a';

    return 0;
}

如果将 4095 更改为 4096,则会按预期发生段错误。但是 4095 效果很好。我几乎可以肯定这与页面大小(在我的系统上是 4096)有关。我的猜测是,在 4095 的情况下,sbrk 调用将整个页面设置为可映射,以便在写入该页面的最后一个字节时成功映射该页面。

但是为什么允许写入(它超出了当前程序中断)?谁能给出更详细的解释?

最佳答案

正如 Basile Starynkevitch 在第一条评论中指出的那样,这是一个硬件限制:“中断”以页面为单位移动。

即使在原始的(基于交换的)PDP-11 Unix 系统上也是如此,其中硬件保护单元是 8192 字节“页面”(不是请求分页页面,而是仍然页面)。

尽管如此,该接口(interface)还是以字节为单位工作的。如果将中断调整到页面的中间,然后一次将其向前移动一个字节,系统调用基本上是一个昂贵的空操作,直到您进入下一页,此时它映射该页面。即使在最初的 PDP-11 系统上也是如此,今天没有特别的理由禁止它。

关于c - 写超出程序中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18583161/

相关文章:

在函数中通过指针调用字符串(语法)

c - 当所有元素都相同时快速排序复杂度?

operating-system - 到底什么是内核线程以及它如何与进程一起工作?

linux - mmap() 在可执行文件上使用时如何工作?

c - 每次迭代都会替换索引中的值

c - 在 GTK3+ 中显示信息对话框时出错

c - 在 write (2) 到 stdout 直到字符串显示在 tty 或虚拟 tty 上之后,Linux 中发生了什么?

c - 在多个内核上同时运行两个函数

c - 为什么/arch/x86/boot/header.S 在汇编中?

python - OSX 使用 os.system 运行 Scrapy 脚本