【问题标题】:Why there is no pagetable_init in init_64.c of linux kernel为什么linux内核的init_64.c中没有pagetable_init
【发布时间】:2022-01-15 16:49:50
【问题描述】:

我目前正在学习Linux中的内核页表初始化过程。在阅读代码时,我发现init_32() 中有一个函数pagetable_init() 用于初始化32 位系统的内核页表。但是,我发现init_64.c 中没有类似的功能用于 64 位系统。所以我想知道Linux中的x86_64是如何初始化内核页表的。

【问题讨论】:

    标签: linux linux-kernel x86-64 page-tables


    【解决方案1】:

    适用于 80x86;您必须准备页表然后切换到长模式(必须使用您的页表),导致您处于“长模式的 16 位兼容性子模式”或“长模式的 32 位兼容性子模式” ";然后在你进入长模式后,你可以切换到 64 位代码。

    因此,对于init_64.c(因为它是 64 位代码),必须在调用代码之前已经初始化了分页。

    对于大多数情况 (UEFI),固件会在启动操作系统的引导加载程序之前初始化分页。请注意,在这种情况下,分页由固件初始化为“所有标识映射” - 内核(或理论上的引导加载程序)仍需要修改内容以适应自身(例如,将内核映射到内核空间)。

    【讨论】:

    • 您能否给出一些提示,告诉我在哪里可以找到初始化内核页表的固件?
    • @LubaA:设置页表的代码(对于固件,符合与 Linux 无关的 UEFI 规范)大部分都是专有代码(由主板制造商等完成)。至少有一个开源 UEFI 实现作为示例(TianoCore 项目),您可以在其中找到:github.com/tianocore/edk2/blob/…
    猜你喜欢
    • 2017-04-08
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多