首页 > 解决方案 > 在概念上将用户虚拟地址、内核逻辑地址和内核虚拟地址捆绑在一起

问题描述

在查看了Linux x86 虚拟内存映射并阅读了内核虚拟地址和内核逻辑地址之间的差异(参见12345等)之后,我有点困惑了。我创建了一个图表来帮助我解释并获得我所理解的反馈。(图表未按比例绘制,但虚拟内存地址来自 4 级 x86 内存映射)

首先,所有用户空间程序都处理用户空间虚拟地址。尽管用户空间地址空间共享相同的内核映射,但用户空间程序不能直接访问内核地址。所有用户空间虚拟地址都必须使用页表进行转换,如果内存在 RAM 中,则这会导致内存驻留在 RAM 上的物理地址。

其次,地址空间的内核部分(在 32 位系统中,是 3:1 的拆分,意味着 1 GB 用于内核),内核将地址空间的一部分用于逻辑地址。逻辑地址是直接映射到物理内存 (1:1) 的虚拟地址。

接下来,内核虚拟地址是驻留在内核地址空间区域内的任何地址,其中包括内核逻辑地址。因此,当人们问内核虚拟地址和内核逻辑地址之间有什么区别时,问题暗示它们是不同的,而实际上内核逻辑地址是内核虚拟地址的子集。他们真正要问的是内核逻辑虚拟地址和内核非逻辑虚拟地址之间的区别。由 使用的非逻辑虚拟地址vmalloc是不直接映射到 RAM 甚至可能不映射到 RAM 的地址。

如果到目前为止我是正确的,那么以下两个结论是否正确?

  1. 映射的用户虚拟地址和内核非逻辑虚拟地址必须以完全相同的方式进行转换:通过遍历页表来获取物理地址。我的证据是function vmalloc_to_page(),因为它vmalloc返回非逻辑虚拟地址。这意味着内核有自己的一组页表,这些页表不与任何用户空间进程相关联。

  2. 在 x86-64 中,每个映射的用户虚拟地址或内核非逻辑虚拟地址都有一个对应的内核逻辑地址。例如,在我的图中,用户空间地址0000700000000000映射到0x1. 因此,为了获得内核逻辑地址,我们添加到离开0x1的直接映射基址。我们可以对具有物理地址的地址做同样的事情,它的内核逻辑地址是。这样,给定任何映射的非逻辑虚拟地址,内核至少有两个虚拟地址可用于查找物理地址(非逻辑虚拟地址及其等效的逻辑地址)。ffff888000000000ffff888000000001vmalloc0x3ffff888000000003

将 Linux x86 虚拟内存映射到物理内存

标签: linuxmemory-managementlinux-kerneloperating-systemkernel

解决方案


推荐阅读