我一直在为使用硬件的原型设备开发操作系统。不幸的是,每次刷新操作系统然后调试问题是一个非常手动且有问题的过程。
我想切换到在 QEMU 中开发操作系统,这样我就可以确保在真正进行设备编程之前,操作系统加载正确。这将在以后的持续集成工作中派上用场。
我有我的构建过程中生成的 NVM 设备的完整副本。这是一个已知的工作映像,我想在 QEMU 中作为起点运行。这准备好然后被 JTAG'd 到设备上。分区布局为:
P0 - loader - 来自rockchip loader二进制文件的IDBLoader闪存
P1 - Uboot - Uboot 刷机
P2 - trust - 针对 Rockchip 特定加载器的 Trust 映像闪存
P3 - / - 具有基于 Debian 的映像和应用程序所需的软件包的根分区
P4 - 数据分区 - 应用数据
除了串行控制台设置之外,我没有对 Rockchip 分区(P0 - P2)进行任何更改。但是,当尝试启动映像时,没有任何反应。根本没有输出,但 VM 显示仍在运行。我使用以下命令来运行它:
qemu-system-aarch64 -machine virt -cpu cortex-a53 \
-kernel u-boot-nodtb.bin \
-drive format=raw,file=image.img \
-boot c -serial stdio
我没有错误信息可以继续了解它发生了什么,我可以从哪里获得更多信息或调试?
答案 0 :(得分:0)
对于其他试图解决这个问题的人,我在这里找到了很好的资源:
https://translatedcode.wordpress.com/2017/07/24/installing-debian-on-qemus-64-bit-arm-virt-board/
和
https://azeria-labs.com/emulate-raspberry-pi-with-qemu/
尽管查看信息,您需要从映像中提取内核并将其作为参数提供给 qemu 命令行。您还需要附加一个参数,告诉系统将哪个分区用作根驱动器。
我用于启动机器的最终命令行如下所示:
qemu-system-aarch64 -machine virt -cpu cortex-a53 \
-drive format=raw,file=image.img,id=hd \
-boot c -serial stdio
-kernel <kernelextracted> -append "root=fe04"
答案 1 :(得分:0)
不同的 Arm 板在放置硬件的位置上可能有很大不同,包括放置启动所需的基本硬件(UART、RAM、中断控制器等)的位置。因此,很可能如果您使用像 u-boot 这样的低级软件或编译为在一块板上运行的 Linux 内核,并尝试在另一块板上运行它,它将无法启动。通常它无法输出任何内容,因为它甚至无法找到 UART。 (Linux 内核可以编译为通用的,并包含适用于更多种硬件的驱动程序,因此如果您有那种内核,它可以在不同的板类型上启动:它将使用设备树 blob,由您或由 QEMU 为 'virt' 板自动生成,以确定它在什么硬件上运行并适应它。但是为特定嵌入式目标编译的内核通常只使用它们需要的设备驱动程序构建,而那种内核不能在不同的系统上启动。)
从广义上讲,您可以采取两条路径:
(1) 为您正在模拟的电路板构建来宾(此处为“虚拟”)。 u-boot 和 Linux 都支持 QEMU 的“virt”板。这可能对您尝试做的事情有用,也可能没有用——您将能够测试任何不关心它在什么硬件上运行的用户空间级代码,但显然不是任何特定于您的真实硬件的代码。重新定位。
(2) 理论上,您可以为您尝试运行的硬件添加对 QEMU 的仿真支持。然而,这通常是相当多的工作,如果您还不熟悉 QEMU 内部结构,这并不是微不足道的。我通常大致估计它“与将内核移植到硬件所需的工作量一样多”;尽管这在一定程度上取决于您/您的客人需要多少功能才能工作,以及 QEMU 是否已经拥有您的硬件正在使用的 SoC 模型。
要回答一般的“调试无法启动的来宾映像的最佳方法是什么”,最好的方法通常是将支持 arm 的 gdb 连接到 QEMU 的 gdbstub。这为您提供了与实际硬件的 JTAG 调试连接大致相似的调试访问权限,并且可能足以让您找出来宾系统崩溃的位置。 QEMU 在“-d”选项下还有一些调试日志选项,尽管日志部分是为了帮助调试 QEMU 本身的问题,而且解释起来可能有点棘手。
答案 2 :(得分:0)
QEMU 不能不模拟任意硬件。您必须编译 U-Boot 以匹配 QEMU 模拟的硬件,例如使用 make qemu_arm64_defconfig
。操作系统还必须为 QEMU 的仿真硬件提供驱动程序。
如果您想模拟完整的硬件来调试驱动程序,Renode (https://renode.io/) 是一个不错的选择。