我目前正在研究xv6操作系统。我对以下代码段有疑问。我知道entrypgdir是pde_t类型的数组,大小为NPDENTRIES。但是“ [0] =(0)| PTE_P | PTE_W | PTE_PS”是什么意思? 预先感谢
__attribute__((__aligned__(PGSIZE)))
pde_t entrypgdir[NPDENTRIES] = {
// Map VA's [0, 4MB) to PA's [0, 4MB)
[0] = (0) | PTE_P | PTE_W | PTE_PS,
// Map VA's [KERNBASE, KERNBASE+4MB) to PA's [0, 4MB)
[KERNBASE>>PDXSHIFT] = (0) | PTE_P | PTE_W | PTE_PS,
};
答案 0 :(得分:1)
代码正在初始化页面目录的内容。 (请参见designated array initialization in C)。
考虑来自OSDev Wiki的页面目录条目内容的图像:
然后考虑以下代码行:
[0] = (0) | PTE_P | PTE_W | PTE_PS
该代码将第一页目录条目(索引0
)的值设置为0 | PTE_P | PTE_W | PTE_PS
。这是按位或来设置各个字段:
0
-清除所有位PTE_P
-设置当前位PTE_W
-设置读\写位PTE_PS
-设置4MiB页面大小位下一行做类似的事情。除了它设置第513个条目的内容(索引512
(0x80000000 >> 22
)):
[KERNBASE >> PDXSHIFT] = (0) | PTE_P | PTE_W | PTE_PS
。
xv6感兴趣的标志的位位置对于页面目录条目(PDE)和页面表条目(PTE)相同。作者opted to share the constants ...而不是为PDE标志创建单独的常量,我认为,此快捷方式使代码在意图上不太清楚。
// Page table/directory entry flags.
#define PTE_P 0x001 // Present
#define PTE_W 0x002 // Writeable
#define PTE_U 0x004 // User
#define PTE_PS 0x080 // Page Size