熟练掌握了线性地址到物理地址的转换后,我们也知道PDE和PTE的结构。当时只知道PDE和PTE中保存了物理页的属性。
1. 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|
2. 物理页属性
可是最后物理页的属性最后是以 PDE 为准,还是以 PTE 中的属性为准?一个物理页索引号的确定是需要 PDE 和 PTE 共同决定的,那么物理页的属性自然也需要 PDE 和 PTE 两者的属性共同决定才行。
物理页属性 = PDE 中的属性 & PTE 中的属性
写成 C 语言的方式,就应该是:
int physical_page_attribute = (0x00000fff & pde) & (0x00000fff & pte);
3. P 位
P 位在上一篇的读写空指针时提到过。这个位很简单,P=1 表示该页有效,P=0 则无效。
4. RW 位
RW = 1时,表示该页可写。
RW = 0时,表示该页只读。
如果你使用过常量区的变量,你可能会知道,什么样的页是只读的。比如:
char *str = "Hello world!";
如果要你修改 str 的内容,你能做到吗?
5. 总结
记住物理页的属性是如何计算的。另外,掌握 P 位和 RW 位。
自己独立完成 RW 的实验(修改常量区内容)。