kexec'ing 到 ELF x86_64 二进制文件后页表的状态是什么?
What is the state of page tables after kexec'ing into an ELF x86_64 binary?
我正在 kexec'ing 到我编写的编译为 x86_64 ELF 的二进制文件中。运行良好。
由于它是 64 位二进制文件,我知道处理器必须处于 64 位长模式。这需要使用分页,所以我知道必须打开分页。
我的问题是,这些页面 table 的状态是什么?是否有某些区域(例如我加载的二进制文件)可以保证进行身份映射?是否映射了所有可用的 RAM 标识?由于启用了分页,页面在哪里?
在 kexec'ing 之后,我想对整个地址进行身份映射 space。为此,我需要在我知道物理地址的地址处构建一些页面 table 结构,然后将该结构的地址写入 CR3。
如果我知道加载到内存中的 elf 二进制文件是身份映射的,我可以在其中静态构建页面 tables,然后进行无缝切换。如果kexec后没有identity mapped pages,我就需要关闭paging,退出long mode,设置好,然后重新进入long 64-bit mode。
谢谢!
特定于 x86-64 的 kexec 进程部分在 arch/x86/kernel/machine_kexec_64.c
中处理。
简而言之:内核分配一个页面table,init_pgtable
函数将其初始化为恒等映射。所以是的,你的方案应该有效。
我正在 kexec'ing 到我编写的编译为 x86_64 ELF 的二进制文件中。运行良好。
由于它是 64 位二进制文件,我知道处理器必须处于 64 位长模式。这需要使用分页,所以我知道必须打开分页。
我的问题是,这些页面 table 的状态是什么?是否有某些区域(例如我加载的二进制文件)可以保证进行身份映射?是否映射了所有可用的 RAM 标识?由于启用了分页,页面在哪里?
在 kexec'ing 之后,我想对整个地址进行身份映射 space。为此,我需要在我知道物理地址的地址处构建一些页面 table 结构,然后将该结构的地址写入 CR3。
如果我知道加载到内存中的 elf 二进制文件是身份映射的,我可以在其中静态构建页面 tables,然后进行无缝切换。如果kexec后没有identity mapped pages,我就需要关闭paging,退出long mode,设置好,然后重新进入long 64-bit mode。
谢谢!
特定于 x86-64 的 kexec 进程部分在 arch/x86/kernel/machine_kexec_64.c
中处理。
简而言之:内核分配一个页面table,init_pgtable
函数将其初始化为恒等映射。所以是的,你的方案应该有效。