/chocomilk

Pure Rust x86_64 bootloader and kernel

Primary LanguageRustMIT LicenseMIT

Summary

This is a bootloader and kernel written nearly entirely in Rust with no third party dependencies at all. Everything in this code base is all you need code wise.

Building

Requirements

To build this you need Rust, nasm, and lld-link (from LLVM's linker). This bootloader and kernel are built identically regardless of the build system. It should build just fine on Linux, Windows, OSX, BSD, whatever.

You can get nasm here or from apt install nasm

You can get LLVM binaries here or apt install lld

You can get Rust here. You must use nightly Rust!

This project requires that you have the i586-pc-windows-msvc and x86_64-pc-windows-msvc Rust targets installed.

rustup target add i586-pc-windows-msvc x86_64-pc-windows-msvc

Specifically nasm, lld-link, rustup, and cargo must be in your PATH. If one of these are not in your path, you may need to create a symlink to the specific version (eg: lld-link-10)

Building

To build this simply run cargo run this will create a folder called pxe that will contain the folder which needs to be exposed via a TFTP server. Optionally, the files could be copied from the pxe folder to your existing PXE deployment folder.

Usage

This bootloader and kernel require PXE booting. They do not support disks in any way, shape, or form. Everything is done over the network. To use this bootloader and kernel you need to set up a valid PXE boot environment. This is done with a DHCP server and a TFTP server.

The TFTP server must point to the directory containing chocolate_milk.boot and chocolate_milk.kern. And the DHCP server should be configured to point to using chocolate_milk.boot as the boot image. This is a BIOS specific bootloader and will not work with EFI/UEFI.

Design

Build System

We use a Rust-based build system found at src/main.rs. We built the build system in Rust such that we don't have to take on any other dependencies for the build process. This build system has some checks for installed programs which are required for building, builds and flattens the bootloader, and assembles the bootloader.

Bootloader

The bootloader is a simple i586 Rust program emit as a MSVC calling convention PE. This is flattened by our build system src/main.rs into an in-memory image of the loaded PE. This is then directly appended to the initial bootloader/src/stage0.asm entry stub. Once 32-bit mode has been entered and selectors have been set up, we branch directly into bootloader::entry()!