You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:23:13