Qemu Aarch64 支持的开发板

Qemu Aarch64 supported Boards

几年前,我开始学习 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 进行编程(正如我在一些在线示例中看到的那样)。

是的,正如您所说,您应该针对特定的 cpu 进行编程。

"-machine " - 根据电路板参考文档定义一组设备,没有 CPU.

"-cpu " - 定义一组ISA features and register reset values that belongs to that particular CPU core, accordance to reference of that CPU core. (here is how qemu do it for aarch64)

把qemu想象成目标ISA软件线程的环境。 与外围设备的所有交互都由 load/stores 和中断传递执行。 要模拟外围设备,我们需要知道 MMIO 基地址、GIC 的中断号以及此类设备的编程模型。 "Board" 在 qemu 术语中是一组这样的设备。

Qemu 对 armv7 机器与 armv8 cpus 的使用没有任何限制,反之亦然。 Here 你可以看到 qemu 如何将 AArch64 引导加载程序放入内存,只有指定 CPU 支持这个指令集,否则它将是 Aarch32。

所有可用于 qemu-system-arm 的 "boards" 也可用于 qemu-system-aarch64:您可以在 qemu sources.

查看构建配置文件

还有所有在 hw/arm/ dir. Their implementation is quite straightforward, all job concentrated at board_init functions: construction devices, assign interrupt lines, place bootloader & dtb 内存中实现的板。

"how do I choose a board" 问题很常见,我们在项目的 wiki 上记录了通常的答案:http://wiki.qemu.org/Documentation/Platforms/ARM

AArch64 的简短回答是您想要使用 "virt" 开发板,除非您明确知道您想要模拟 64 位 Xilinx 开发板之一(听起来您并不知道).您还需要使用 -cpu cortex-a53 指定 CPU 类型,因为 "virt" 板的默认值是 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 板,由于这不是对真实硬件建模,因此其详细信息仅在 QEMU 源代码和我们传递给来宾的设备树 blob 中指定。对于裸机客户机 OS,您需要知道:

  1. 在地址 0x0 处有引导闪存(您可以使用 -bios 或 -pflash QEMU 命令行选项填充)
  2. UART 是位于 0x0900000 的 pl011
  3. RAM 从 0x40000000 开始
  4. 关于存在哪些设备以及它们在内存中的位置的所有其他信息都应该从设备树 blob 中获取,它可以在 RAM 的底部找到,假设您是通过 -bios 加载的裸机 blob 或-pflash。 (如果您说您是通过 -kernel 加载的 Linux 内核,那么我们将按照内核引导 ABI 指定的方式传递 DTB。不过,裸机映像通常不应使用 -kernel。)