QEMU-system-aarch64的Semihosting是否支持aarch64-unknown-none环境?
Rust [no_std] aarch64-unknown-none 下 Semihosting 配置方案
支持情况说明
Semihosting 完全支持 aarch64-unknown-none 环境,QEMU 的 virt 虚拟机和 cortex-a57 CPU 均具备 Semihosting 能力,你遇到无输出的问题大概率是命令参数冗余或代码实现未正确调用 Semihosting 接口导致。
修正后的 QEMU 启动命令
原命令中 -semihosting 与 -semihosting-config enable=on 存在重复配置,简化后的有效命令如下:
qemu-system-aarch64 -machine virt -cpu cortex-a57 -m 256M -semihosting-config enable=on,chardev=semi0 -chardev stdio,id=semi0,signal=off -kernel kernel.bin
该命令明确关联 Semihosting 到主机标准输入输出,同时关闭信号传递避免 QEMU 意外退出。
可运行的 Rust 代码片段
1. Cargo 配置
在项目根目录创建 .cargo/config.toml:
[target.aarch64-unknown-none] rustflags = [ "-C", "link-arg=-Tlink.x", "-C", "relocation-model=static", ] [build] target = "aarch64-unknown-none"
link.x 链接脚本可通过安装 rust-src 组件获取(执行 rustup component add rust-src),Rust 会自动关联对应的 aarch64 链接脚本。
2. 依赖配置
修改 Cargo.toml 添加必要依赖:
[dependencies] arm-semihosting = "0.10" panic-semihosting = "0.6"
3. 核心代码(src/main.rs)
#![no_std] #![no_main] use arm_semihosting::{hprintln, debug::exit}; use panic_semihosting as _; #[no_mangle] extern "C" fn _start() -> ! { // 输出测试信息到主机终端 hprintln!("Semihosting is working on aarch64-unknown-none!").unwrap(); // 正常退出QEMU exit(arm_semihosting::debug::EXIT_SUCCESS); loop {} }
4. 编译与运行
- 编译:
cargo build --release - 生成二进制文件:
rust-objcopy --strip-all target/aarch64-unknown-none/release/[你的项目名] -O binary kernel.bin - 启动 QEMU:使用上述修正后的命令
关键注意事项
- 必须确保链接脚本正确加载,否则代码无法执行到
_start入口函数 panic-semihosting用于将 panic 信息输出到主机,便于调试- 若仍无输出,可检查 QEMU 版本(建议使用 6.0 以上版本),或添加
-d semihosting参数开启 QEMU Semihosting 调试日志排查问题
内容的提问来源于stack exchange,提问作者piosystems
相关产品推荐
相关产品推荐

