内核虚拟地址转换

Posted

技术标签:

【中文标题】内核虚拟地址转换【英文标题】:kernel virtual address translation 【发布时间】:2011-06-17 03:25:39 【问题描述】:

考虑到 Linux 和 32 位 x86 架构,可访问的 4GB 地址空间以 3:1 的比例划分。用户空间分配 0-3 Gb,而 3-4 Gb 分配给内核。 大于 3Gb 并因此位于内核地址空间中的虚拟地址如何转换为物理地址?页表会出现吗?

【问题讨论】:

【参考方案1】:

Mel Gorman 的书中有一些信息Understanding the Linux Virtual Memory Manager。

简短的回答:是的,内核设置页表来将物理地址 0 转换为虚拟地址 3 GiB。 (第 3.7.1 节)。这包括内核加载到的物理位置(在 x86 上通常为 1MB)。

【讨论】:

感谢您的回答。在做了一些谷歌搜索后,我发现有一个 #define PAGE_OFFSET 是 3GB(可配置),并且内核虚拟地址与通过简单地从内核虚拟地址中减去 PAGE_OFFSET 获得的物理地址具有一对一的映射,因此不使用页表。如果我错了,请纠正我。 这种简单的映射使 virt_to_phys() 的实现变得容易:正如您所说,只需减去 PAGE_OFFSET。但是分页是启用的——这允许在硬件中将虚拟地址转换为物理地址,因为指令被提取和数据被访问。 我明白你的意思。无论虚拟地址属于内核还是用户空间,启用分页时始终使用页表。 (唉!!!我不能投票,因为它至少需要 15 分) 我的 0.2:有人可能想知道——如果我们在内核中使用分页,它不会减慢速度吗?是的,但这在像 Linux 这样的现代操作系统中通过以下方式得到缓解:(a) 确定内核映射 TLB 条目,(b) 现代处理器具有大型 TLB,以及 (c) 使用大/巨大页面进行内核映射(透明巨大页?)。

以上是关于内核虚拟地址转换的主要内容,如果未能解决你的问题,请参考以下文章

解答关于内核中没开MMU之前的虚拟地址物理地址转换问题

linux内核中的虚拟到物理地址转换

虚拟地址转换为物理地址

虚拟地址空间布局架构

访问内存时如何通知操作系统内核?

在 Linux 中将物理地址转换为虚拟地址并读取其内容