此代码在xv6 entrypgdir中意味着什么?

时间:2019-10-27 01:50:54

标签: xv6

我目前正在研究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,
};

1 个答案:

答案 0 :(得分:1)

代码正在初始化页面目录的内容。 (请参见designated array initialization in C)。

考虑来自OSDev Wiki的页面目录条目内容的图像:

page directory entry

然后考虑以下代码行:

[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个条目的内容(索引5120x80000000 >> 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