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

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

【问题讨论】:

    标签: memory-management linux-kernel paging


    【解决方案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) 使用大/巨大页面进行内核映射(透明巨大页?)。
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 2018-02-23
    • 2018-08-12
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多