(undone) 解析 qemu-6.0.0 源码 (4) 添加 niubi board - 2

添加 niubi board

首先设计一下这块板子:

复制代码
- 名字:`RISC-V Niubi board`
- RV64 单核,也可以叫 single RV64 hart
- 默认 128 MiB RAM
- RAM 基址:`0x80000000`
- CPU 复位地址:默认也是 `0x80000000`
- 支持用 `-kernel` 装载 ELF、uImage 或裸二进制,并把 CPU 复位地址改为镜像入口
- 没有串口、中断控制器、定时器、设备树、固件和其他外设

需要注意,-kernel 启动不代表使用 QEMU 内置 bootloader。

-kernel` 的含义是:把指定的内核或裸机镜像交给板级代码装载,并不等同于"使用 QEMU 内置 bootloader"。

这里的"板级代码"指的是 QEMU 中用于模拟这块板子的宿主机 C 代码,需要注意模拟代码不会精确实现硬件行为 (那是仿真器干的事情),很多时候会为了性能、抽象层级选择一些比较取巧的做法。

-kernel 具体行为由不同 machine 决定:

  • virt 板:QEMU 通常加载默认 OpenSBI 固件、生成复位 ROM 和设备树,再由 OpenSBI 跳转到 -kernel 指定的内核。
  • -bios none:可以禁止默认固件,但之后必须自行解决启动入口。
  • 我们的 niubi 板:没有 bootloader。它直接通过 riscv_load_kernel() 把镜像装入 RAM,并把 CPU 的 resetvec 设置为镜像入口,因此 CPU 复位后直接执行该镜像。
  • -bios:通常才用于明确指定 BIOS、固件或 bootloader。

我们的最终目标是在运行

bash 复制代码
$ ./output/qemu/bin/qemu-system-riscv64 -M help

时能看到 niubi board 被作为一种选择:

复制代码
niubi                RISC-V Niubi board

同时,可以使用下面命令启动 ELF 格式的内核镜像

bash 复制代码
qemu-system-riscv64 -M niubi -kernel program.elf

而且启动链非常短:

复制代码
QEMU 加载 program.elf
    → 读取 ELF 入口
    → 设置 CPU resetvec
    → CPU 直接从入口执行

中间没有 OpenSBI、U-Boot 或其他 bootloader。

TODO: here

相关推荐
冰山一脚20135 小时前
cirrus显卡驱动笔记
qemu·drm
shimly1234566 小时前
(done) 解析 qemu-6.0.0 源码 (2) 寻找入口函数 main
qemu
ggaofeng19 天前
QEMU中硬盘用哪种协议读写速度快
qemu·磁盘类型
GKxx1 个月前
在 HarmonyOS 上给 QEMU 搭一个最小 aarch64 Linux guest(内核 + busybox initramfs)
linux·华为·qemu·harmonyos·鸿蒙·鸿蒙pc
k4m7v2pz2 个月前
在Arch Linux笔记本上搭建ReactOS 0.4.15虚拟机:从Mac远程开发调试Windows XP风格应用的完整指南
qemu·虚拟机·kvm·交叉编译·mingw-w64·reactos
冰山一脚20132 个月前
qemu设备监听虚拟机状态笔记
qemu
萧青山2 个月前
【信创实战】x86电脑运行麒麟ARM系统:QEMU虚拟化完全指南(含一键脚本、性能优化、AI部署)
qemu·信创·麒麟系统·arm虚拟化·ai部署
一个平凡而乐于分享的小比特3 个月前
QEMU:一台“用软件造出来的万能计算机”
qemu
凉、介3 个月前
KVM + QEMU 虚拟化
笔记·学习·嵌入式·arm·qemu·虚拟化·kvm