此代码在xv6条目pgdir中是什么意思?

问题描述 投票:1回答:1

我目前正在研究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,
};
xv6
1个回答
0
投票

该代码正在初始化页面目录的内容。 (请参阅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
© www.soinside.com 2019 - 2024. All rights reserved.