我一直在使用硬件为一个原型设备开发操作系统。不幸的是,这是一个非常手动和错误的过程,每次刷新操作系统,然后调试问题。
我想切换到在QEMU中开发操作系统,这样我就可以在经历真正的设备编程的faff之前确保操作系统正确加载。这将在以后的持续集成工作中派上用场。
我有一个从构建过程中生成的NVM设备的完整副本。这是一个已知的工作映像,我希望在QEMU中作为起点运行。这是准备好,然后JTAG到设备上。分区布局为:
P0 - loader -来自rockchip加载器二进制文件的IDBLoader闪存
P1 - Uboot - Uboot闪存
P2 -信任- rockchip专用加载器的信任映像闪存
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我没有错误信息来继续了解它发生了什么,我可以从哪里获得更多信息或进行调试?
发布于 2021-07-15 22:39:46
对于其他试图弄清楚这个问题的人,我在这里找到了很好的参考资料:
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"发布于 2021-07-16 17:44:18
不同的Arm板可能在硬件放置位置上存在显著差异,包括它们放置启动所需的基本硬件(UART、RAM、中断控制器等)的位置。因此,如果你拿一块低级软件,比如u-boot或一个编译成在一块板上运行的Linux内核,并试图在另一块板上运行它,那么它将无法启动。通常,它无法输出任何内容,因为它甚至无法找到UART。(Linux内核可以编译成通用的,并包含更多硬件的驱动程序,所以如果你有这种内核,它可以在不同的主板类型上启动:它将使用一个设备树blob,要么由你提供,要么由QEMU为'virt‘板自动生成,以找出它在什么硬件上运行并适应它。但是为特定嵌入式目标编译的内核通常只使用它们需要的设备驱动程序构建,并且这种内核不能在不同的系统上引导。)
一般来说,你有两条路可以走:
(1)为你正在模拟的板(这里是'virt‘板)构建来宾。u-boot和Linux都支持QEMU的“virt”板。这可能对您正在尝试做的事情有用,也可能没有用--您将能够测试任何用户空间级别的代码,这些代码并不关心它在什么硬件上运行,但显然不是特定于您所针对的真实硬件的任何代码。
(2)理论上,您可以向QEMU添加对您试图在其上运行的硬件的仿真支持。但是,这通常是一项相当多的工作,如果您还不熟悉QEMU的内部结构,那么这项工作也不是微不足道的。我通常将其大致估计为“大约与将内核移植到硬件所需的工作量一样多”;尽管这有点取决于您/您的客户需要多少功能才能运行,以及QEMU是否已经有了您的硬件正在使用的SoC模型。
要回答“调试无法引导的客户映像的最佳方法是什么”,最好的方法通常是将支持arm的gdb连接到QEMU的gdbstub。这为您提供了大致类似于到实际硬件的JTAG调试连接的调试访问,并且可能足以让您找出来宾操作系统崩溃的位置。QEMU在'-d‘选项下也有一些调试日志记录选项,尽管日志记录在一定程度上是为了帮助调试QEMU本身的问题,解释起来可能有点棘手。
发布于 2021-07-17 03:07:06
QEMU不能模拟任意硬件。您必须编译U-Boot以匹配QEMU模拟的硬件,例如使用make qemu_arm64_defconfig。操作系统还必须为QEMU的仿真硬件提供驱动程序。
如果您想要仿真完整的硬件来调试驱动程序,Renode (https://renode.io/)是一个很好的选择。
https://stackoverflow.com/questions/68392676
复制相似问题