1. 最小可启动裸机程序
任务说明
本案例编写一段 RISC-V 汇编启动代码,在 QEMU 的 virt 虚拟机上通过 UART 输出一个字符 'A',然后进入死循环。目标是验证交叉工具链可用、链接脚本正确、启动流程能跑通。
环境与依赖
- RISC-V 交叉工具链:
riscv64-unknown-elf-gcc、riscv64-unknown-elf-objcopy(或riscv64-linux-gnu-前缀,按本机安装调整)。 - QEMU:
qemu-system-riscv64。 - 目标机:QEMU
virt机器,UART0 基地址0x10000000,寄存器偏移0x00为发送寄存器。
启动与输出流程
链接脚本 start.ld
OUTPUT_ARCH(riscv)
ENTRY(_start)
SECTIONS {
. = 0x80000000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
启动汇编 start.S
.section .text
.globl _start
_start:
li t0, 0x10000000 # UART0 基地址
li t1, 'A' # 要输出的字符
sb t1, 0(t0) # 写入发送寄存器
1:
j 1b # 死循环
编译与运行
riscv64-unknown-elf-gcc -march=rv64imac -mabi=lp64 -nostdlib -T start.ld -o start.elf start.S
riscv64-unknown-elf-objcopy -O binary start.elf start.bin
qemu-system-riscv64 -machine virt -bios start.bin -nographic
若工具链前缀为 riscv64-linux-gnu-,替换命令前缀即可。
验证方法与通过条件
- 编译无报错,生成
start.elf与start.bin。 - 运行 QEMU 后终端出现字符
A,随后程序不再输出任何内容(处于死循环)。 - 按
Ctrl-A再按X退出 QEMU。
满足以上条件即说明工具链、链接脚本与启动流程均正确。