如何在QEMU sifive_e实现从启动到UART0输出的裸机RISC-V程序及疑问
RISC-V裸机启动与QEMU仿真相关疑问
我希望深入了解简单RISC-V计算机的启动流程,无需涉及完整操作系统,仅需掌握从开机到运行裸机程序向UART设备输出数据的过程。因启动流程与硬件相关,我选择SiFive HiFive1 RevB开发板,它成本较低且可通过QEMU的sifive_e机器进行仿真。
我的目标是理解启动流程中的所有代码,尤其对Firmware、Bootloader、QEMU的-bios和-kernel参数的作用存在疑惑。预期成果是编写一个能向UART0输出"Hello World"后停机的RISC-V汇编程序,且不使用高级语言、工具链及链接器。
我已在QEMU virt机器上实现该程序,通过Python脚本生成二进制文件test.bin,经objdump反汇编可见其逻辑为生成virt机器的UART0地址0x10000000并写入"Hello World"的每个字节,可通过qemu-system-riscv32 -nographic -machine virt -bios test.bin或-kernel参数运行,但产生不同现象。
具体疑问
- 使用
-bios test.bin时,我的代码是否为CPU启动后运行的第一段代码?是否存在BIOS之前的固件阶段?QEMU virt机器的默认BIOS有何作用? - 将代码移植到
sifive_e机器时,仅修改UART0地址为0x10013000后运行无输出且挂起,缺少哪些必要步骤?何处可获取sifive_e的启动流程文档?QEMUsifive_e的启动流程是否与HiFive1 RevB板一致?
内容的提问来源于stack exchange,提问作者statusfailed
相关产品推荐
相关产品推荐

