【发布时间】: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
我目前正在学习Linux中的内核页表初始化过程。在阅读代码时,我发现init_32() 中有一个函数pagetable_init() 用于初始化32 位系统的内核页表。但是,我发现init_64.c 中没有类似的功能用于 64 位系统。所以我想知道Linux中的x86_64是如何初始化内核页表的。
【问题讨论】:
标签: linux linux-kernel x86-64 page-tables
适用于 80x86;您必须准备页表然后切换到长模式(必须使用您的页表),导致您处于“长模式的 16 位兼容性子模式”或“长模式的 32 位兼容性子模式” ";然后在你进入长模式后,你可以切换到 64 位代码。
因此,对于init_64.c(因为它是 64 位代码),必须在调用代码之前已经初始化了分页。
对于大多数情况 (UEFI),固件会在启动操作系统的引导加载程序之前初始化分页。请注意,在这种情况下,分页由固件初始化为“所有标识映射” - 内核(或理论上的引导加载程序)仍需要修改内容以适应自身(例如,将内核映射到内核空间)。
【讨论】: