Closed5
mikanos のビルドツールに依存せず Rust での自作 OS ビルド & 実行環境を作る

久しぶりに OS 開発を再開し,一から再度やり直すことにしたのでメモ.せっかくなので,mikanos のビルドツールをあえて使わないことにした.
GitHub:https://github.com/itsu-dev/churu-os-bootloader
環境
Rust その他のビルドツールを Docker コンテナに包み,さらに DevContainer にまとめてポータブルな開発環境にした.開発用 PC は Ubuntu 24.04 の Intel Core i7 8th Gen.
実際の開発時には開発用 PC に MacBook の VSCode から Remote SSH 経由で接続して開発している.devcontainer にまとめることで rust-analyzer も動くようになって嬉しい.

.devcontainer/
- どこでも開発できて嬉しい.
- Rust のツールチェインを Docker コンテナに包んだら rust-analyzer が使えなくなったので採用した.
- ホストマシンに rust がインストールされていない && Remote SSH な環境なので,rust-analyzer はホストマシン上で
cargo
などを叩こうとしてエラーになる.
- ホストマシンに rust がインストールされていない && Remote SSH な環境なので,rust-analyzer はホストマシン上で
devcontainer.json
{
"dockerComposeFile": ["docker-compose.yml"],
"service": "rust",
"workspaceFolder": "/app"
}
docker-compose.yml
-
command: /bin/sh -c "while sleep 1000; do :; done"
を追加しないと devcontainer のビルド中にコンテナが終了してしまうことでエラーになるので,常時起動するためにつけておく.
services:
rust:
build:
dockerfile: ./Dockerfile
volumes:
- ../:/app
working_dir: /app
environment:
- USER=rust
command: /bin/sh -c "while sleep 1000; do :; done"
Dockerfile
-
rustlang/rust:nightly
をベースに,ビルド時のボリューム作成などに必要なパッケージをインストールしておく.
FROM rustlang/rust:nightly
RUN apt-get update && \
apt-get install -y \
qemu-utils \
nasm \
dosfstools \
binutils \
mtools \
parted \
udev
RUN rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu

Makefile
-
make
コマンド一発で Rust プログラムのコンパイルからディスクイメージ作成までできるようにした. - Cargo.toml でプロジェクト名を
bootloader
にしている. - 後半のコマンドで ESP パーティションを作り,target ディレクトリの中に生成された .efi ファイルを新規作成したボリュームの中にコピーしている.
- Claude と協業して作った.
build:
cargo build -Zbuild-std -Zbuild-std-features=compiler-builtins-mem --target x86_64-unknown-uefi
rm -rf ./build
mkdir ./build
mkdir -p ./build/EFI/BOOT
cp ./target/x86_64-unknown-uefi/debug/bootloader.efi ./build/EFI/BOOT/BOOTX64.EFI
cd ./build && \
dd if=/dev/zero of=uefi.img bs=1M count=64 && \
parted -s uefi.img mklabel gpt && \
parted -s uefi.img mkpart primary fat32 1MiB 100% && \
parted -s uefi.img set 1 esp on && \
mkfs.vfat -F 32 uefi.img && \
mmd -i uefi.img ::/EFI && \
mmd -i uefi.img ::/EFI/BOOT && \
mcopy -i uefi.img EFI/BOOT/BOOTX64.EFI ::/EFI/BOOT/ && \
chmod 666 ./uefi.img
.PHONY: build

OVMF のダウンロード
- 開発環境とブートローダーの準備 を参考に,EDK II - Browse /OVMF at SourceForge.net から EDK II 製の UEFI ファームウェアを落としてプロジェクトのルートに突っ込んでおく.
- OVMF.fd は DL した zip の中にある.
qemu のインストール
sudo apt-get update -y
sudo apt-get install -y qemu-system

run.sh
- 実行用のスクリプト
- ホストマシンで実行する.
sudo qemu-system-x86_64 -hda ./build/uefi.img -nographic -drive if=pflash,format=raw,file=OVMF.fd
このスクラップは4ヶ月前にクローズされました