Operating system 这个页面目录有效吗?

Operating system 这个页面目录有效吗?,operating-system,paging,i386,Operating System,Paging,I386,我不确定我对寻呼的理解。我想通过创建一个假想的页面目录,让社区指出我的错误来进行检查 让我们假设内核代码适合第一个帧-0x0000到0x1000,并且页面目录将放在0x10000。这将是一张身份地图 首先,我看了英特尔80386手册,找到了这个插图 ╔══════════════════════════════════════╤═══════╤═══╤═╤═╤═══╤═╤═╤═╗ ║ │ │ │ │ │

我不确定我对寻呼的理解。我想通过创建一个假想的页面目录,让社区指出我的错误来进行检查

让我们假设内核代码适合第一个帧-0x0000到0x1000,并且页面目录将放在0x10000。这将是一张身份地图

首先,我看了英特尔80386手册,找到了这个插图

╔══════════════════════════════════════╤═══════╤═══╤═╤═╤═══╤═╤═╤═╗ ║ │ │ │ │ │ │U│R│ ║ ║ PAGE FRAME ADDRESS 31..12 │ AVAIL │0 0│D│A│0 0│/│/│P║ ║ │ │ │ │ │ │S│W│ ║ ╚══════════════════════════════════════╧═══════╧═══╧═╧═╧═══╧═╧═╧═╝ 这意味着它存在,相应的页表为0000000000000001,右移12位。其计算结果为0x11000。这就是我的目标,但它真的是这个意思吗?。现在我理解了当前的位,但是在这种情况下读/写意味着什么?它不是指一个框架,所以

对于位于0x11000的页表: 除了地址外,一切都差不多

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

这是内核的完整页表目录。这是正确的吗?在这过程中有什么错误吗?读/写位作为页面目录项意味着什么?

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

换句话说,一个页面的有效读写状态是所有分页结构中的R/W位的逻辑AND。如果您正在尝试写入,并且CPU在其页表遍历的任何阶段都遇到一个清除的R/W位,那么它可以在出现页错误时提前退出。当有更多级别时,此原则在64位模式下仍然有效


如果您需要将大内存区域设置为只读,这可能会很方便;您只需清除页面目录项中的R/W位,而无需遍历表中的所有页面。一个常见的例子是调用fork的Unix进程;它的所有可写内存都需要变成只读,这样就可以在写入时进行复制。

谢谢!我假设用户/主管位也是如此?所以,如果所有的分页结构都是相同的,那么这是唯一的用户级别。@TheCriminister:是的,正确。
11000000 0000000 00000000 00000000
11000000 0000100 00000000 00000000
etc
11000000 0000100 01000000 00000000