我试图使用QEMU模拟Arietta G25电路板,但遇到了一些困难。
我开始使用补丁来编译Linux以支持Arietta,如here所述。然后,我检查了qemu-system-arm -M help
支持的计算机列表,并注意到虽然未列出Arietta板,但versatileab
和versatilepb
有一个与Arietta具有相同处理器的选项。
在内核目录arch/arm/boot
中,我运行了命令
QEMU_AUDIO_DRV=none \
qemu-system-arm -M versatilepb \
-m 256M \
-kernel zImage \
-dtb dts/acme-arietta.dtb \
-nographic \
-append "console=ttyAMA0"
由于缺少根文件系统,我预计会看到内核启动并立即发生混乱。但是,我的控制台上没有显示任何文字。
我尝试使用控制台的参数(例如使用ttyS0
,添加费率等),但这不起作用。
答案 0 :(得分:2)
对于习惯于使用x86的ARM嵌入式世界的人来说,这是一个非常常见的混淆点。对于x86,基本上你购买的所有硬件看起来都像标准PC - 内存,串口等都将完全相同,并以相同的方式访问。因此,客户软件通常只适用于任何这些系统。
ARM非常不同。不同的嵌入式板和SoC将具有不同的设备,并将它们放在不同的地址。需要构建在其上运行的软件以与这些设备一起工作,并且尝试在错误类型的设备上运行低级软件(如内核或引导加载程序或固件映像)将无法工作。这里发生的事情是,您已经说过启动为Arietta构建的内核,并告诉它UART是Arietta的UART生活的地方,但是你正在运行它在一块非常不同的模拟硬件(versatilepb)上。内核将尝试与不存在且将崩溃的硬件进行通信。它无法打印任何内容,因为它不知道versatilepb UART的位置。为QEMU添加对新板模型仿真的支持并不是一个简单的过程(可以认为它与为Linux内核添加对该板的支持相同的工作量),因为您需要编写设备模型该板上的所有硬件以及客户内核尝试使用的硬件。