有关Xen HVM来宾启动的问题:hvmloader,直接内核启动和模拟BIOS

时间:2016-09-09 22:53:29

标签: x86 virtualization xen hypervisor

我试图了解xen如何处理启动HVM来宾。任何 答案,见解或相关文档的链接将是非常重要的 理解...

IIUC,离开"内核"和" ramdisk"您的xl.cfg文件中未设置选项 意味着你想要"直接内核启动"相反,你想要的 客户启动使用"模拟固件&#34 ;:即固件代码 xen作为单个连续的二进制blob加载到guest虚拟机内存中。就像我一样 理解它,xen实际上加载了选定的BIOS二进制blob 磁盘到guest虚拟机中的特定内存位置(通常为0xF0000)和 然后,在转换到实模式后,跳转到" guest"中的复位向量。模式以启动引导过程。我还没有找到关于此的大量文档,但我假设模拟的固件入口点0xFFFF0确保HVM来宾将执行POST并执行BIOS在重置后通常会执行的其他操作,它将在"客人" (非root)模式。除了POST之外,我假设这个模拟的BIOS代码将尝试从其中一个虚拟磁盘加载MBR"磁盘" xl.cfg中的选项(除非选择的BIOS是ovmf,在这种情况下,我假设模拟的ovmf固件将寻找EFI系统分区和合适的.efi文件)。

令我困惑的一件事是" hvmloader"。我明白这一点 在"工具"下构建为独立的可执行文件。在xen源中。 看一下hvmloader.c顶部的内联汇编,我看到了 这是对hvmloader main的调用,它包含对bios_load()的调用,可能是为了执行前面提到的固件blob加载到0xF0000。从hvmloader main返回后,内联汇编转换回16位实模式,最终跳转到复位向量(0xFFFF0),可能是为了执行hvmloader main加载的BIOS / UEFI固件blob。这是有道理的,但我错过了一些整体环境:例如,在英特尔处理器上,我假设当hvmloader运行时我们需要处于非根(访客)模式。这是如何完成的?即,谁启动hvmloader以及如何?我在工具/ libxl / libxl_dom.c中看到了代码(具体来说,在函数libxl__domain_firmware中对xc_dom_kernel_file的调用),这似乎是将它加载到内存中,但从那里它变得有点模糊......是否使用了超级调用启动客人DomU? hvmloader的_start是否标记了每个非直接内核启动HVM来宾的入口点?

此外,xen / arch / x86 / hvm / vmx / entry.S中的VMX进入/退出逻辑如何适用于此处的图片?我假设该代码仅在VMM上运行,并且它包含某种调度机制,用于在各个guest虚拟机之间切换。

我愿意为在源代码级别处理这些概念的非过时的书付费,但我发现的最近的一本书是在近10年前发布的。

提前致谢, 布雷特斯塔尔曼

0 个答案:

没有答案