【问题标题】:how the paging of pages works in unix systems?页面的分页如何在 unix 系统中工作?
【发布时间】:2020-08-27 05:22:22
【问题描述】:

我正在尝试研究“理解 Linux 内核”一书,但我停在“常规分页”部分。现在,我明白了为什么需要分页,它下面的概念是什么,但是......我无法理解很多东西。为什么表格页面的分页(s?我不记得了)是必要的,它是如何工作的?我的意思是,是的,一个表页的大小会太大,但是,如果在线性地址和物理地址之间的转换中,内核会根据 lin 的第一部分选择某个表页。补充一下,它必须在内存中的某个地方找到整组表页,所以......如果空间已经浪费了,为什么不做一个巨大的表页呢?然后,书上说 table page 中每个条目的维度是 32 位的,但是......如果页面是 4kb,为什么不使用这个事实呢?我们知道最后 12 位是 0,那么为什么不让它们隐含呢?我知道我说的所有这些事情都是错误的,我说这些只是为了更好地解释我的疑问。 (对不起,糟糕的英语)

【问题讨论】:

  • "为什么不使用这个事实?我们知道最后 12 位是 0,那么为什么不让它们隐含呢?" - 最后 12 位实际上用于非地址事物。参见例如osdev.

标签: linux kernel system paging


【解决方案1】:

将页面描述符分成多个表有以下好处:

  1. 粒度。如果您的程序只使用三个页面(文本、数据、堆栈),所有这些页面描述符都可能在一个页表中,并且内存开销会非常低——一个叶页表加上几个内部节点。

  2. 稀疏性。与效率类似,根(目录)表只需要包含有效地址空间部分的条目;其余的表指针可以设置为无效页面,因此无需填充它们。

  3. 分享。很有可能不仅内存,而且页表本身也可以在大型共享内存对象的进程之间共享。 IIRC solaris 将此称为“亲密共享内存”(ISM)。同样,内核映射之类的东西可能会在多个进程之间完全共享。

  4. 性能。常见的 64 位架构使用 47 位地址空间。对于 4k 页面粒度,线性映射将需要 2^35 个页面描述符,每 8 个字节。在我吱吱作响的 mac pro 上,只需将这么多的 ram 归零就需要 48 秒。这就是启动流程的成本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多