内核的文档/x86/x86_64/mm.txt写道:
ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
因此,我假设此区域中的地址映射不应大于实际物理DRAM大小。但是在一台16 got内存和内核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,这显然是非法的,因为它大于实际的内存大小(16‘s正好是0x400000000)。
那么,这些大型虚拟地址的规则是什么?我如何才能为其获取正确的物理地址?
非常感谢!
发布于 2017-06-27 11:31:23
您的PC不仅有DRAM,而且还有ROM (现在是闪存)和I/O存储器。为了向后兼容,这些地址中的一部分必须映射到20位和32位地址空间,因此RAM的最后一部分最终位于0x400000000以上的某个地址。
发布于 2017-06-27 12:31:21
物理地址不仅仅用于RAM。连接到机器的不同设备也有一些物理地址。处理器简单地将物理地址放在地址总线上,一个或一个设备将对其作出响应。
因此,在您情况下,这些物理地址可能是某些IO设备,如ROM (CD、ROM等)。
此外,RAM的物理地址也可以大于16 of。只是取决于它放在哪里。
https://stackoverflow.com/questions/44778637
复制相似问题