出于研究目的,我目前正在从头开始开发x86-64内核。目标是使用Intel的虚拟化技术(VT-x)虚拟化自己的操作系统。但是我偶然发现了一个极其奇怪的问题,该问题使我无法继续执行我的项目:
进入访客操作系统后,内核的32位入口点需要立即获取内核跳转到的64位入口点的地址。这是通过检索位于来宾物理内存中的内核ELF标头的值来完成的。但是,在此时要检索内核ELF标头的地方,我的操作系统抛出一个错误,指出在指定的地址上没有标头:
为说明图片,屏幕的下半部分是主机的输出,而上半部分是guest虚拟机的输出。
现在我想知道为什么即使我确定将内核ELF标头放置在来宾物理内存(0x0019A000)中的特定地址也没有任何原因。现在要牢记一个非常重要的信息:在出现错误消息时,分页尚未启用。这就是说,正如英特尔文档中所述:
如果CR0.PG = 0,则每个线性地址都将视为来宾物理地址。
由于CR0没有设置位31,因此此时绝对不能启用分页。 (CR0的值:0x60000011)
所以我通过Bochs检查了物理内存转储:
似乎在那里,但是执行发生在线性地址空间中,指令指针正在从线性地址空间中读取指令,然后出现问题:
所以我的问题是:在禁用分页的同时,仅在一个内存区域中,物理地址和线性地址空间存在差异的原因是什么?
我检查了: