#bootloader #disk-image #osdev #bootloader-api

构建 bootloader_linker

一个简单的程序,可以将使用 bootloader_api 创建的可执行文件与实际的引导加载程序链接起来

7 个版本

0.1.7 2024年2月11日
0.1.6 2024年2月10日
0.1.5 2023年10月29日

#170 in 构建工具

MIT/Apache

215KB
204

包含 (ELF 可执行文件/库, 1MB) 测试二进制文件

bootloader-linker

一个简单的程序,可以将使用 bootloader_api 包创建的可执行文件与实际的 bootloader 包链接到磁盘镜像中。还支持使用 qemu 运行磁盘镜像。

bootloader_linker -V
bootloader_linker 0.1.6 using bootloader 0.11.6

安装

可以通过 cargo 直接安装。您需要一个带有 llvm-tools-previewrust-src 组件的 nightly 编译器。

rustup component add llvm-tools-preview
rustup component add rust-src
cargo install bootloader_linker

使用方法

bootloader_linker -h
A simple program that links your executables created using bootloader_api with the actual bootloader.

Usage: bootloader_linker [OPTIONS] <COMMAND> <INPUT_FILE> [EXTRA_ARGS]...

Arguments:
  <COMMAND>        [possible values: build, run, build-run]
  <INPUT_FILE>     The binary/.img file to operate on
  [EXTRA_ARGS]...  Extra args to pass to qemu

Options:
  -u, --uefi
          Sets the loader to use uefi instead of bios
  -o, --out-dir <OUT_DIR>
          The directory to put output files in. Ignored if not building a disk image [default: ./]
  -q, --qemu-path <QEMU_PATH>
          The name of the qemu executable. Ignored if not running a disk image [default: qemu-system-x86_64]
  -m, --mount-file <FILES_TO_MOUNT>
          Extra files to mount to the FAT filesystem
  -H, --min_height <MINIMUM_FRAMEBUFFER_HEIGHT>
          Specifies the minimum frame buffer height desired. If it is not possible, the bootloader will fall back to a smaller format
  -W, --min_width <MINIMUM_FRAMEBUFFER_WIDTH>
          Specifies the minimum frame buffer width desired. If it is not possible, the bootloader will fall back to a smaller format
  -l, --log-level <LOG_LEVEL>
          The minimum level of logging to still display [default: trace] [possible values: off, trace, debug, info, warn, error]
  -f, --frame_logging
          Whether the bootloader should print log messages to the framebuffer during boot
  -s, --serial_logging
          Whether the bootloader should print log messages to the serial port during boot
  -a, --args <ARGS>
          Extra args to pass to qemu. You can also put them after -- at the end of the command
  -h, --help
          Print help (see more with '--help')
  -V, --version
          Print version

请注意,为了运行磁盘镜像,您需要安装 qemu。如果可执行文件不在 PATH 中,您可以使用 --qemu-path 指定它。

示例

bootloader_linker build-run test_binary -o ./target -- -serial stdio
// Bootloader booting info...
Hello world!

用于创建此输出的测试二进制文件在仓库中,并使用类似于以下源代码构建

#![no_std]
#![no_main]

use core::panic::PanicInfo;

use bootloader_api::entry_point;

entry_point!(main);

fn main(_info: &'static mut bootloader_api::BootInfo) -> ! {
    qemu_print::qemu_print!("Hello world!");
    loop {}
}

#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    loop {}
}

qemu_print

还有三个子命令的缩写

  • build 可以缩写为 b
  • run 可以缩写为 r
  • build-run 可以缩写为 br

高级使用

与 cargo run 一起使用

bootloader-linker 适合与 cargo run 一起使用。将这些行添加到您的 .cargo/config.toml 文件中

[target.'cfg(target_os = "none")']
runner = ["bootloader_linker", "br", "-o", "./target", "-u"]

现在,cargo run 将调用 bootloader_linker 而不是直接尝试运行可执行文件。

如果您想将额外的参数传递给 qemu,不能使用正常的 -- 符号,因为 cargo 会将额外的参数放在二进制文件之前。因此,例如,

runner = ["bootloader_linker", "br", "--", "-serial", "stdio"]

将产生以下命令

bootloader_linker br -- -serial stdio [BINARY]

这将不会工作。

如果您想传递额外的参数,您必须使用 -a 参数逐个传递它们。

bootloader_linker br -a"-serial" -a"stdio" [BINARY]

因此,您的runner字段应该看起来像这样

runner = ["bootloader_linker", "br", "-o", "./target", "-u", "-a'-serial'", "-a'stdio'"]

如果您的额外参数不包含空格,您也可以移除引号

runner = ["bootloader_linker", "br", "-o", "./target", "-u", "-a-serial", "-astdio"]

挂载额外文件

如果您需要将其他文件挂载到.img文件系统,请使用--mount-file(或-m)指定它们

bootloader_linker br [BINARY] --mount-file [FILE] -u -o ./target

如果您需要挂载多个文件,请多次包含该参数

bootloader_linker br [BINARY] --mount-file [FILE_A] --mount-file [FILE_B] -u -o ./target

报告错误

此命令行实用程序尚未经过充分测试。如果您有任何问题,请在github上的仓库中报告。

依赖项

~8–18MB
~231K SLoC