【问题标题】:why there are such large virtual addresses in a x86_64 kernel's memory layout为什么 x86_64 内核的内存布局中有这么大的虚拟地址
【发布时间】:2017-06-27 11:00:42
【问题描述】:

内核的文档/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)。

那么这些大型虚拟地址的规则是什么?我怎样才能获得正确的物理地址呢?

非常感谢!

【问题讨论】:

    标签: memory linux-kernel x86-64 virtual-address-space address-space


    【解决方案1】:

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

    【讨论】:

    • 谢谢!我终于在 [link]resources.infosecinstitute.com/… 上找到了一个介绍,其中有一张显示整个内存布局的漂亮图片。我得到的另一个问题是这个大地址似乎无法用于 DMA 操作,所以我假设该地址位于“主内存回收地址范围”内。我从 virt_to_phys() 获得的地址与从 DDR 控制器的视图中获得的地址不同,这种差异导致该地址不能用于 DMA。如果我错了,请纠正我
    【解决方案2】:

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

    所以在你的情况下,这些物理地址可能是一些 IO 设备,如 ROM(CD ROM 等)。

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

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 2013-01-10
      • 2019-07-03
      • 2021-09-11
      • 2013-09-04
      • 2012-01-18
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      相关资源
      最近更新 更多