Intel VT-x:物理和线性地址空间不匹配

时间:2018-10-22 22:48:38

标签: intel virtualization osdev

出于研究目的,我目前正在从头开始开发x86-64内核。目标是使用Intel的虚拟化技术(VT-x)虚拟化自己的操作系统。但是我偶然发现了一个极其奇怪的问题,该问题使我无法继续执行我的项目:

进入访客操作系统后,内核的32位入口点需要立即获取内核跳转到的64位入口点的地址。这是通过检索位于来宾物理内存中的内核ELF标头的值来完成的。但是,在此时要检索内核ELF标头的地方,我的操作系统抛出一个错误,指出在指定的地址上没有标头:

Error: Kernel ELF header not found

为说明图片,屏幕的下半部分是主机的输出,而上半部分是guest虚拟机的输出。

现在我想知道为什么即使我确定将内核ELF标头放置在来宾物理内存(0x0019A000)中的特定地址也没有任何原因。现在要牢记一个非常重要的信息:在出现错误消息时,分页尚未启用。这就是说,正如英特尔文档中所述:

  

如果CR0.PG = 0,则每个线性地址都将视为来宾物理地址。

由于CR0没有设置位31,因此此时绝对不能启用分页。 (CR0的值:0x60000011)

所以我通过Bochs检查了物理内存转储:

enter image description here

似乎在那里,但是执行发生在线性地址空间中,指令指针正在从线性地址空间中读取指令,然后出现问题:

enter image description here

所以我的问题是:在禁用分页的同时,仅在一个内存区域中,物理地址和线性地址空间存在差异的原因是什么?

我检查了:

  • GDT(用于32位的CS和DS设置,基数= 0x0,限制= 0xfffff)
  • 细分的选择器已相应设置
  • 用于将来宾物理地址(GPA)映射到主机物理地址(HPA)的EPT:地址是绝对映射的,甚至将内存转储到主机物理地址空间中也向我展示了内核ELF标头是在那里应该
  • 绝对未启用分页,因此memdump应该在相同地址的内存中显示相同内容

0 个答案:

没有答案