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 为发送寄存器。

启动与输出流程

QEMU 复位 PC = 0x80000000 _start 入口 写 UART0 发送寄存器 输出 'A' 死循环

链接脚本 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。

满足以上条件即说明工具链、链接脚本与启动流程均正确。