An experimental pure-Rust x86 bootloader for the planned second edition of the Writing an OS in Rust series.
This is still work in progress.
The idea is to build the kernel as a no_std
longmode executable and then build the bootloader with the kernel ELF file in kernel.bin
. The output is a flat binary disk image (including a basic MBR) that can be run in QEMU or burned to an USB flash drive (CDs require a different kind of bootloader, which is not supported at the moment). The plan is to create a custom tool (or cargo subcommand) that performs these steps automatically.
You need a nightly Rust compiler, xargo, objcopy (or a similar tool), and QEMU (for running it).
If you are building on Mac OS and get a error saying ld.bfd not found
you first need to cross compile binutils and then adjust
the linker name in the x86_64-bootloader.json
file. The reason for this is the default rust LLVM linker doesn't support some features this project needs.
After doing that continue with the instructions for Linux.
> RUST_TARGET_PATH=$(pwd) xargo build --target x86_64-bootloader --release
> objcopy -O binary -S target/x86_64-bootloader/release/bootloader bootimage.bin
> qemu-system-x86_64 -hda bootimage.bin -d int -s