几年前,我开始学习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 进行编程(正如我在网上的一些示例中所看到的那样(。
我如何选择董事会"的问题是一个很常见的问题,我们在项目的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 客户机一样,这就是为什么列表如此之长且充满了 32 位主板。但是,您不能只是尝试使用带有-cpu cortex-a53的32位板 - 这就像尝试将Core2Duo插入旧的i386主板,即使QEMU没有打印有关组合的错误消息,也无法正常工作。
对于 virt 板,由于这不是对真正的硬件进行建模,因此其详细信息仅在 QEMU 源代码和我们传递给来宾的设备树 blob 中指定。对于裸机客户机操作系统,您需要了解:
- 地址 0x0 处有引导闪存(您可以使用 -BIOS 或 -pflash QEMU 命令行选项填充(
- UART是PL011在0x0900000
- 内存从 0x40000000 开始
- 有关存在哪些设备以及它们在内存中的位置的所有其他信息都应从设备树 blob 中获取,该 blob 位于 RAM 底部,假设您是通过 -bios 或 -pflash 加载的裸机blob。(如果你说你是一个通过 -kernel 加载的 Linux 内核,那么我们按照内核引导 ABI 指定的方式传递 DTB。不过,裸机映像通常不应使用 -kernel。
是的,正如你所说,你应该针对特定的CPU进行编程。
"-machine">- 根据电路板参考文档定义一组设备,无需CPU。
"-cpu">- 定义一组 ISA 功能,并根据该 CPU 内核的引用注册属于该特定 CPU 内核的重置值。(这是QEMU为AAh64所做的(
将 qemu 想象成目标 ISA 的软件线程环境。 与外围设备的所有交互都由加载/存储和中断传递执行。 为了仿真外围设备,我们需要知道MMIO基址,GIC的中断号以及此类设备的编程模型。qemu 术语中的"板"是一组此类设备。
Qemu 对 armv7 机器与 armv8 CPU 的使用没有任何限制,反之亦然。在这里,您可以看到 qemu 如何在指定的 CPU 支持此指令集时才将 AArch64 引导加载程序放入内存,否则它将是 Aarch32。
此外,所有可用于 qemu-system-arm 的"板"也可用于 qemu-system-aarch64:您可以在 qemu 源代码中查看构建配置文件。
此外,所有主板均在硬件/手臂/目录下实施。它们的实现非常简单,所有工作都集中在board_init功能上:构建设备,分配中断线,将引导加载程序和dtb放在内存中。