最近在完成一个使用 Rust 语言编写 Linux 内核引导程序的项目 lboot ,其核心代码和原理在之前的博客中介绍过 UEFI 如何启动 Linux

因为不可能直接在 UEFI 环境下进行代码开发,所以我使用的是交叉编译的方法,目标平台是 x86_64-unknown-uefiaarch64-unknown-uefi 。这就带来了一个问题,使用命令 cargo run 不能直接运行代码,必须使用 qemu 来模拟目标架构的执行。

真的不行吗?其实是可以的🥳🥳🥳

在翻阅 Cargo Book 之后发现,在命令行重载这一章中写到可以使用 runner 字段来定义自己的 cargo run 行为。

当执行 cargo run 时,cargo 会首先将这个 runner 字段中的命令末尾附上构建出的可执行文件的路径(相当于把路径传入 runner 脚本或命令),然后执行这个命令。

所以我编写了一个包装脚本 ,它接受两个参数,第一个是目标平台,第二个是 UEFI 可执行文件的路径。然后编写 .cargo/config.toml 文件:

[target.x86_64-unknown-uefi]
runner = "test/qemu_run.sh x86_64"

[target.aarch64-unknown-uefi]
runner = "test/qemu_run.sh aarch64"

runner 字段只写一个参数是因为,cargo run 时可执行文件路径会附加到最后。

现在就可以直接 cargo run 启动 qemu 仿真了!