这个页面目录有效吗?

Is this page directory valid?

我不确定我对分页的理解。我想通过创建一个假设的页面目录来检查,并请社区指出我的错误。

假设内核代码适合第一帧 - 0x0000 到 0x1000,页面目录将放在 0x10000。这将是一个身份映射。

所以首先,我去看了intel 80386手册,找到了这张插图

 ╔══════════════════════════════════════╤═══════╤═══╤═╤═╤═══╤═╤═╤═╗
 ║                                      │       │   │ │ │   │U│R│ ║
 ║ PAGE FRAME ADDRESS 31..12            │ AVAIL │0 0│D│A│0 0│/│/│P║
 ║                                      │       │   │ │ │   │S│W│ ║
 ╚══════════════════════════════════════╧═══════╧═══╧═╧═╧═══╧═╧═╧═╝

页目录将只有一个条目(当前位不会设置在其他位上)。这是:

11000000 00001000 10000000 00000000

所以这意味着它存在,并且相应的页面 table 在 00000000 0000001 0001,右移 12 位。计算结果为 0x11000。 (这就是我的目标,但它实际上是这个意思吗?)。现在我明白了现在的位,但是 read/write 在这种情况下是什么意思?它不是指框架,所以...

对于位于 0x11000 的页面 table: 一切都几乎相同,除了地址。

11000000 0000000 00000000 00000000
11000000 0000100 00000000 00000000
etc
11000000 0000100 01000000 00000000

那是内核的完整页面 table 目录。这个对吗?一路上有没有错误? read/write 位作为页目录条目意味着什么?

请参阅英特尔系统编程指南中的 Table 4-5 以及第 4-6 节。在页面目录条目中,R/W 位控制相应页面 table 中所有页面的可写性,即整个 4MB 虚拟内存区域。因此,如果您清除该位,则该区域中的所有页面都是只读的,无论它们各自的 R/W 位可能设置为什么。如果您设置该位,则 CPU 参考页面本身的 R/W 位来决定是否允许写入。

换句话说,页面的有效读写状态是你走到它的所有分页结构中的R/W位的逻辑与。如果您正在尝试写入,并且 CPU 在其页面 table 遍历的任何阶段遇到一个已清除的 R/W 位,它可以通过页面错误提前退出。当有更多级别时,此原则在 64 位模式下继续成立。

如果您需要将大块内存设置为只读,这可能会很方便;您可以只清除页面目录条目中的 R/W 位,而无需遍历 table 中的所有页面。一个常见的例子是调用 fork() 的 Unix 进程;它的所有 writable 内存都需要变为只读,以便它可以写时复制。