写出程序休息时间

时间:2013-09-03 02:23:05

标签: c operating-system

为什么可以在以下程序中编写超出当前程序中断的内容?

int main()
{
    sbrk(4095);

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

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

    return 0;
}

如果将4095更改为4096,则会出现预期的seg故障。但4095运作良好。我几乎可以肯定这与pagesize(我系统上的4096)有关。我的猜测是,在4095的情况下,sbrk调用将整个页面设置为可映射,以便在写入发生在该页面的最后一个字节时成功映射页面。

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

1 个答案:

答案 0 :(得分:2)

Basile Starynkevitch在第一条评论中指出,这是一个硬件限制:“休息”以页面为单位移动。

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

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