我正在将kexec压缩成我编写的二进制文件,并将其编译为x86_64 ELF。运行正常。
因为它是64位二进制,所以我知道处理器必须处于64位长模式。需要使用分页,所以我知道必须打开分页。
我的问题是,这些页表的状态是什么?是否有某些区域(例如我加载的二进制文件)可以保证进行身份映射?是否所有可用的RAM标识都已映射?由于启用了分页,因此页面在哪里?
kexecing之后,我想标识整个地址空间。为此,我需要在我知道物理地址的地址处构建一些页表结构,然后将该结构的地址写入CR3。
如果我知道加载到内存中的elf二进制文件是身份映射的,则可以在其中静态构建页表,然后无缝切换。如果kexec之后没有标识映射的页面,则需要关闭分页,退出长模式,然后进行设置,然后重新进入64位长模式。
谢谢!
x86-64特有的kexec进程部分在arch/x86/kernel/machine_kexec_64.c
中处理。
简而言之:内核分配页表,arch/x86/kernel/machine_kexec_64.c
函数将其初始化为身份映射。所以,是的,您的方案应该有效。