几年前,我开始学习Arm架构。我发现Qemu和我使用它的realview a8模拟板来基于Armv7进行编程。电路板有一个LCD控制器,一个中断控制器等。我可以找到他们所有的规格,最后做了一个非常非常基本的调度程序,编写Arm组件中的所有内容,这很酷。然后我停下来忙着工作。
现在我想回到它,这次是使用Armv8和AArch64。但我找不到AArch64支持哪些主板。查询Qemu显示qemu-system-arm和qemu-system-aarch64的相同电路板列表。甚至基于Armv7的a8,a9和A15板也出现在qemu-system-aarch64列表中。这是否意味着没有电路板仿真,我应该针对像A53这样的特定CPU进行编程(正如我在网上的一些例子中看到的那样)。
答案 0 :(得分:2)
"我如何选择一块电路板"问题是一个很常见的问题,我们记录了该项目维基的常见答案:http://wiki.qemu.org/Documentation/Platforms/ARM
AArch64的简短回答是你想要使用" virt"除非你特别知道你要仿效64位Xilinx板之一(听起来你不是这样)。您还需要使用-cpu cortex-a53指定CPU类型,因为" virt" board的默认值是cortex-a15(一个32位CPU)。
qemu-system-aarch64二进制文件支持所有32位CPU和主板,与qemu-system-x86_64允许您运行32位x86 CPU guest虚拟机的方式相同,这就是列表如此之长的原因。充满了32位板。你不能尝试使用带有-cpu cortex-a53的32位电路板 - 这就像尝试将Core2Duo插入旧的i386主板一样,即使QEMU没有打印出来也无法正常工作有关该组合的错误消息。
对于virt board,由于这不是对真实硬件进行建模,因此其详细信息仅在QEMU源代码和我们传递给guest虚拟机的设备树blob中指定。对于裸机客户操作系统,您需要知道:
答案 1 :(得分:1)
是的,正如你所说,你应该针对特定的cpu进行编程。
“ - machine” - 根据电路板参考文档定义一组没有CPU的设备。
“ - cpu” - 根据该CPU内核的引用,定义一组ISA功能并注册属于该特定CPU内核的重置值。 (here is how qemu do it for aarch64)
想象一下qemu作为目标ISA软件线程的环境。 与外围设备的所有交互都通过加载/存储和中断传递来执行。 要模拟外围设备,我们需要知道MMIO基地址,GIC的中断号以及此类设备的编程模型。 qemu术语中的“Board”是一组这样的设备。
Qemu对armv7机器与armv8 cpu的使用没有任何限制,反之亦然。 Here 你可以看到qemu只有在指定的CPU支持这个指令集时才将AArch64 bootloader放到内存中,否则它将是Aarch32。
qemu-system-arm的所有“电路板”也可用于qemu-system-aarch64:您可以在qemu sources查看构建配置文件。
所有电路板都在hw/arm/ dir实施。它们的实现非常简单,所有工作都集中在 board_init 功能:构造设备,分配中断线,放置引导加载程序和放大器。 dtb在记忆中。