内核虚拟地址转换
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) 使用大/巨大页面进行内核映射(透明巨大页?)。以上是关于内核虚拟地址转换的主要内容,如果未能解决你的问题,请参考以下文章