![我们应该以 ELF 格式还是 zImage 格式启动 FreeBSD 内核?如何?](https://linux22.com/image/226835/%E6%88%91%E4%BB%AC%E5%BA%94%E8%AF%A5%E4%BB%A5%20ELF%20%E6%A0%BC%E5%BC%8F%E8%BF%98%E6%98%AF%20zImage%20%E6%A0%BC%E5%BC%8F%E5%90%AF%E5%8A%A8%20FreeBSD%20%E5%86%85%E6%A0%B8%EF%BC%9F%E5%A6%82%E4%BD%95%EF%BC%9F.png)
我们刚刚在我们的 Arm(32 位)Chromebook 上虚拟化了 Debian 12。作为主机 / dom0,我们选择了 Devuan 5,对于访客 / domU,我们选择了 Debian 12。它运行得很好。但我们的目标不同。我们想要将 FreeBSD 虚拟化为 domU。我们可以为 FreeBSD arm guest 提供一个可用的 Xen PV 网络驱动程序吗?我发现 Julien Grall 已经将 Xen 驱动程序移植到了 Arm 上的 FreeBSD 上。我想知道 Julien 的工作是否被 FreeBSD 上游接受,在这种情况下,如果我们在 Arm 内核上的 FreeBSD 中启用 Xen PV 驱动程序,FreeBSD 作为 Arm 上的 Xen 来宾应该可以工作。如果 Julien 的工作没有被 FreeBSD 上游接受,我们将不得不找到他的补丁并将其应用到 Arm 内核上的 FreeBSD 上。
我们发现了这些幻灯片:
幻灯片 13 提到了 Arm 内核配置上的 XENHVM FreeBSD - 这就是我们想要找到的。
看起来在编写幻灯片演示时,FreeBSD Xen 客户端存在一些限制。例如,对于我们的 debian bookworm guest 虚拟机,我使用 vcpus = '2' 来匹配 Chromebook 上的真实 cpu 数量,但幻灯片 13 提到 FreeBSD guest 虚拟机仅支持 1 个 VCPU,因此我需要更改该 vcpu = '1' 在 FreeBSD 来宾配置中,除非后来添加了对 2 个或更多 vcpu 的支持,这是可能的,因为该幻灯片演示已有 9 年了。
我希望在这里找到 XENHVM FreeBSD on arm 内核配置文件:
https://cgit.freebsd.org/src/tree/sys/arm/conf
但它不在那里,除非我没有正确理解某些东西。目前不幸的是,Julien Grall 在 9 年前的幻灯片演示中提到的对 Xen on Arm 的支持从未添加到官方 FreeBSD 源代码中。我现在正在网上搜索 Julien Grall 编写的补丁是否仍然发布在网上的某个地方。如果我们找不到它们,我们可以在此处和 xen-users 邮件列表上询问。 Julien 定期阅读该列表并回答有关 Xen on Arm 的问题,因此我认为如果我们无法在网上找到补丁,他会告诉我们如何找到补丁。
根据 FreeBSD wiki 的这个页面:
我认为FreeBSD只支持x86上的Xen,而不支持arm。因此,让 Xen FreeBSD 来宾在 Arm 上工作将是一个挑战。我们知道 Julien Grall 有一些补丁可以让它在过去发挥作用!
我在这里找到了 Julien 的一个稍新的幻灯片演示:
https://www.slideshare.net/xen_com_mgr/bsdcan-2015-how-to-port-your-bsd
内容大致相同,但它提到 GENERIC FreeBSD 内核支持 arm64 上的 Xen,但仍然说我们需要适用于 arm 32 位上的 Xen 的 XENHVM FreeBSD 配置,我尚未在网上找到该配置。
请看一下可以在 Xen 上启动的 linux 内核的输出,以及不能在 Xen 上启动的 FreeBSD 内核的输出:
% file zImage-6.1.59-stb-xen-cbe+
zImage-6.1.59-stb-xen-cbe+: Linux kernel ARM boot executable zImage (little-endian)
% file FREEBSD-XENVIRT
FREEBSD-XENVIRT: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /red/herring, for FreeBSD 11.0 (1100048), not stripped
无法启动的 FreeBSD 内核是 ELF 格式,但能够启动的 Linux 内核是 zImage 格式。
我花了一些时间阅读 xenbits.xenproject.org 上的文档,根据这些文档,ARM 上的 Xen 只知道如何以 zImage 格式启动内核,因此 FreeBSD 内核的格式被现代 Xen 错误地检测为 x86 内核。
我还在 FOSDEM 2014 上观看了 Julien Grall 的 30 分钟视频演示,介绍了他在 Xen 上启动 FreeBSD/arm 的工作:
https://archive.fosdem.org/2014/schedule/event/freebsd_xen_arm/
在该视频和其他地方,Julien 提到 Xen 上的 FreeBSD/arm 的启动 ABI 尚未开发,他偶尔会发生崩溃,需要调查该问题。他提到了 Linux 使用的 zImage ABI,但指出 FreeBSD 不使用该格式,当时使用哪种格式在 Xen 上启动 FreeBSD/arm 是一个悬而未决的问题。不幸的是,九年后,唯一支持的格式仍然是 Linux 使用的 zImage 格式。
看起来 Julien 当时的工作是使用 ELF 二进制文件在 Xen 上启动 FreeBSD/arm,而不是 Linux 使用的受支持的 zImage 格式,并且在尝试启动 Julien 补丁创建的 FreeBSD ELF 格式的二进制文件时,现代 Xen 工具堆栈会退出并出现错误。因此,最好的解决方案是尝试移植规则,以 zImage 格式而不是 ELF 格式构建 FreeBSD 内核。我一直在研究Linux中的Makefiles,看看Linux如何以zImage格式构建Linuxarm内核,但理解起来并不简单。