为什么在x86_64内核的内存布局中有如此大的虚拟地址

时间:2017-06-27 11:00:43

标签: linux-kernel

kernel的Documentation / x86 / x86_64 / mm.txt说:

ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory

因此我假设在该区域中不应存在大于实际物理DRAM大小的地址映射。但在具有16GB DRAM和内核v4.2.8的x86_64 PC上,我从/ sys / kernel / debug / kernel_page_tables得到了这个结果:

---[ Low Kernel Mapping ]---

......

0xffff88008b3ff000-0xffff88008b400000           4K     RW                 GLB NX pte

0xffff88008b400000-0xffff8800c0000000         844M                               pmd

0xffff8800c0000000-0xffff880100000000           1G                               pud

0xffff880100000000-0xffff880400000000          12G     RW         PSE     GLB NX pud

0xffff880400000000-0xffff88043dc00000         988M     RW         PSE     GLB NX pmd

0xffff88043dc00000-0xffff88043dc25000         148K     RW                 GLB NX pte

0xffff88043dc25000-0xffff88043dc27000           8K     ro                 GLB NX pte

.......

0xffff88045c200000-0xffff88046f000000         302M     RW         PSE     GLB NX pmd

0xffff88046f000000-0xffff880480000000         272M                               pmd

0xffff880480000000-0xffff888000000000         494G                               pud

0xffff888000000000-0xffffc90000000000       66048G                               pgd

你看到有虚拟地址为0xffff88043dc00000的页面条目,使用 这样的虚拟地址上的virt_to_phys()将获得0x43dc00000,即 显然是非法的,因为它比实际的DRAM大小(16GB只是 0x400000000)。

那么这些大型虚拟地址的规则是什么?如何为它获取正确的物理地址?

非常感谢!

2 个答案:

答案 0 :(得分:0)

您的PC不仅有DRAM,还有ROM(现在是闪存)和I / O内存。为了向后兼容,必须将其中的一部分映射到20位和32位地址空间,因此RAM的最后部分最终位于0x400000000以上的某个地址。

答案 1 :(得分:0)

物理地址不仅适用于RAM。连接到机器的不同设备也有一些物理地址。处理器只是将物理地址放在地址总线上,一个或设备将响应它。

因此,在您的情况下,这些物理地址可能是某些IO设备,如ROM(CD ROM等)。

此外,RAM的物理地址也可能大于16GB。只是取决于它的位置。