不知在《分页》文章里,你有没有搞懂什么是页,同时还延伸出了页表的概念。另外,还解释了逻辑地址、线性地址和物理地址之间的关系。我知道你脑子可能是一团浆糊,这只能怪我的语言表达能力还不够强。
大段大段的文字让人读起来有时候很恼火,可是为了阐释问题,大段大段文字有时候又避免不了。所以,有时候不得不砍去细支末节,压缩篇幅。
为了能够强化分页的知识,本篇扼要回顾前两篇内容,精简总结几个概念之间的关系。
1. 页、页索引号、页表、页目录
- 页:物理内存中固定大小(4KB)的连续内存块。必须以4KB对齐划分。
- 页索引号:把物理内存中的页挨个编号,从 0 开始,一直到最后一页。如果是物理内存只有40KB大小,最后一页的索引号就是 9.
- 页索引号占用 20 bit.
- 页表:一个大小为 1024 个元素的数组,用来保存页索引号。数组中的每个元素的高20 bit 用来保存页索引号,低 12 bit 保存页属性。每个元素的大小是 32 bit,也就是 4 字节。
- 一个页表本身占用一页(4KB)
- 页目录:页表本身既然也占用一页,那页表本身这个物理页也是有索引号的。所以保存这种物理页索引号的页表,叫一级页表,也叫页目录。
图1 中展示了页目录、页表和普通物理页之间的关系,这张图在14篇你也见到过。细心的你可能会注意到一级页表中,有一个表项,PDE768,它竟然指向了自己!
这没有什么好惊讶的,因为一级页表中保存的,本来就是另一个页表所在物理页的索引号。一级页表难道就不是页表吗?
2. PDE、PTE
即使我不说,你肯定也知道 PDE、PTE是什么了。
没错,PDE 是页目录表项。而 PTE是页表表项。(在以后的文字里,一级页表我将以页目录表代之;二级页表,简称页表。)
为何一个 PDE、PTE都要单独拿出来说?还记得不,不管是PDE还是PTE,其中的高 20 bit 是用来保存索引号的,而低 12 bit,你只知道保存了属性,如果你还没有去百度 or 谷歌,你肯定不知道这 12 bit 保存了什么。
无论怎样,先来看看 PDE 和 PTE 的结构。
- PDE 结构
|<------ 31~12------>|<------ 11~0 --------->| 比特|b a 9 8 7 6 5 4 3 2 1 0|
|--------------------|-|-|-|-|-|-|-|-|-|-|-|-| 占位
|<-------index------>| AVL |G|P|0|A|P|P|U|R|P| 属性|S| |C|W|/|/||D|T|S|W|
- PTE 结构
|<------ 31~12------>|<------ 11~0 --------->| 比特|b a 9 8 7 6 5 4 3 2 1 0|
|--------------------|-|-|-|-|-|-|-|-|-|-|-|-| 占位
|<-------index------>| AVL |G|P|D|A|P|P|U|R|P| 属性|A| |C|W|/|/||T| |D|T|S|W|
从上面的结构,发现 PDE 和 PTE 的结构基本上差不多,但是有个别比如第 7 位就不一样。
3. 属性含义
- P:有效位。0 表示当前表项无效。
- R/W: 0 表示只读。1表示可读写。
- U/S: 0 表示只能0、1、2特权级可访问。3 表示只有特权级程序可访问
- A: 0 表示该页未被访问,1表示已被访问。
- D: 脏位。0表示该页未写过,1表示该页被写过。
- PS: 只存在于页目录表。0表示这是4KB页,指向一个页表。1表示这是4MB大页,直接指向物理页。
- PWT、PCD、G:暂不讲解
4. 总结
本篇回顾了前两篇的知识,旨在巩固大家对页、页目录、页表的理解。另外,给出了 PDE和PTE的详细结构。
其中需要注意的是,页目录表中的 PS 位,当 PS 为 0 的时候,就是我们前面所熟知的 4 KB 小页面。如果该位为 1,那么该 PDE 指向的不是页表,而是一个 4MB 的普通物理页。