最近在完成一个使用 Rust 语言编写 Linux 内核引导程序的项目 lboot ,其核心代码和原理在之前的博客中介绍过 UEFI 如何启动 Linux 。
因为不可能直接在 UEFI 环境下进行代码开发,所以我使用的是交叉编译的方法,目标平台是 x86_64-unknown-uefi
和 aarch64-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 仿真了!