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 などを叩こうとしてエラーになる.

devcontainer.json

{
  "dockerComposeFile": ["docker-compose.yml"],
  "service": "rust",
  "workspaceFolder": "/app"
}

docker-compose.yml

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
ちゅるりちゅるり

run.sh

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