添加 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。
我们的最终目标是在运行
$ ./output/qemu/bin/qemu-system-riscv64-Mhelp时能看到 niubi board 被作为一种选择:
niubi RISC-V Niubi board同时,可以使用下面命令启动 ELF 格式的内核镜像
qemu-system-riscv64-Mniubi-kernelprogram.elf而且启动链非常短:
QEMU 加载 program.elf → 读取 ELF 入口 → 设置 CPU resetvec → CPU 直接从入口执行中间没有 OpenSBI、U-Boot 或其他 bootloader。
TODO: here