4

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

4

2 回答 2

4

“我如何选择电路板”问题是一个很常见的问题,我们在项目的 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 中指定。对于裸机客户操作系统,您需要了解:

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

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

“-machine” - 定义一组设备,根据板参考文件,没有 CPU。

“-cpu” - 根据该 CPU 内核的引用定义一组ISA特性和寄存器复位值,这些值属于该特定 CPU 内核。(这里是 qemu 如何为 aarch64 做的

将 qemu 想象成目标 ISA 软件线程的环境。与外围设备的所有交互都是通过加载/存储和中断传递来执行的。要模拟外围设备,我们需要知道 MMIO 基地址、GIC的中断号以及此类设备的编程模型。qemu 术语中的“板”是一组这样的设备。

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

此外,所有可用于 qemu-system-arm 的“板”也可用于 qemu-system-aarch64:您可以在qemu sources中查看构建配置文件。

此外,所有板都在hw/arm/ dir 中实现。它们的实现非常简单,所有工作都集中在board_init函数上:构建设备、分配中断线、将引导加载程序和dtb放在内存中。

于 2017-07-20T12:14:24.157 回答