为什么页面全局目录中的条目会偏移?如果有的话,偏移量的意义是什么?
页面全局目录
地址 | 条目 1 | 条目 2 |
---|---|---|
0000000080036000: | 0x0000000000000000 | 0x0000000000000000 |
... | ... | ... |
0000000080036bf0: | 0x0000000000000000 | 0x0000000000000000 |
0000000080036c00: | 0x000000002000d401 | 0x0000000000000000 |
0000000080036c10: | 0x0000000000000000 | 0x0000000000000000 |
... | ... | ... |
0000000080036ff0: | 0x0000000000000000 | 0x0000000000000000 |
为什么不在 0x80036000 的位置 0 开始条目?
RISC-V (sv39) 的 Linux 和 seL4 使用三级页表,该页表具有页全局目录 (PGD)、页中间目录 (PMD) 和页表条目 (PTE)。PTE 条目指向可执行数据。正是这样:http ://www.science.unitn.it/~fiorella/guidelinux/tlk/node34.html
每个表为 4096 字节或 0x1000。每个条目是 64 字节。每个表可以有 512 个条目 (0x200)。一些表——特别是 PGD 和 PMD 有偏移的条目。换句话说,条目不是从表中的位置 0 开始,而是在表中途甚至 3/4 处为 0。我试图理解为什么会这样。
问题是关于表格中的位置而不是位置的内容。这就是为什么从 0x80036c00 开始而不是 0x2000d401 的含义?我知道 0x2000d401 指向 PMD 中的一个条目,该条目指向 PTE 中的一个条目,最后指向可执行代码。
我可以毫无问题地在概念上遍历页表。我的问题是我已经在我的二进制文件中移动了有效负载并修改了页表以使用 4KB 而不是 2MB 页面。这适用于特殊情况,但不适用于一般情况,我试图了解原因。我怀疑基于我得到的 QEMU 输出的页表有问题。