M2Macで「ゼロからのOS自作入門」(通称:みかん本)のMikanOSを動かしたので、環境構築やビルドコマンドをまとめました。
こちらの VSCode Devcontainer 設定ファイルを使ったのでとっても簡単にできました! ありがとうございます!
初期準備
こちらにアクセスし、右上の Use this template → Create a new repository を押します。
ローカルに落としたら、VSCodeで開きます。
ターミナルに、
$ git clone https://github.com/uchan-nos/mikanos.git
$ git clone https://github.com/uchan-nos/mikanos-build.git
と入力し、MikanOSのソースコードをダウンロードします。
.devcontainer/Dockerfile を開き、
- FROM ghcr.io/sarisia/mikanos:${VARIANT}
+ FROM ghcr.io/sarisia/mikanos:vnc
.devcontainer/devcontainer.json の16から26行目をコメントアウトします。
ルートに .gitignore ファイルを作成し、*.imgを追加しておくとPCストレージの節約になります。
コンテナビルド後の手順
ビルドして動かしていると、たまに mount できなくなることがありました。 そんなときはコンテナをリビルドすると解決します。
左下の >< からコンテナを開きなおしましょう。
$ cd ~/edk2
$ code .
でedk2を新しいウィンドウで開きます。
新しいウィンドウのターミナルに、
$ ln -s /workspaces/mikanos-devcontainer/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
~/edk2/Conf/target.txt を開き、
ACTIVE_PLATFORM = MikanLoaderPkg/MikanLoaderPkg.dsc
TARGET_ARCH = X64
TOOL_CHAIN_TAG = CLANG38
~/edk2/Conf/target.txt を開き、(ARMMacのみの手順)
- DEFINE CLANG38_X64_TARGET = -target x86_64-pc-linux-gnu
+ DEFINE CLANG38_X64_TARGET = -target x86_64-linux-gnu
- DEBUG_CLANG38_X64_CC_FLAGS = DEF ... -g
+ DEBUG_CLANG38_X64_CC_FLAGS = DEF ... -g -I/usr/x86_64-linux-gnu/include
実行手順
dayZZa のところは対応する節ごとに置き換えてください。
エミュレータには http://localhost:6080 からアクセスできます。 ターミナルに q もしくは quit と入力することで終了できます。
day01
$ ~/osbook/devenv/run_qemu.sh ~/osbook/day01/bin/hello.efi
day02a ~ 02b
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day02a
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi
コンテナをリビルドした際に入力するコマンドを分けるのが面倒だったので、一度しか入力しなくていいコマンドも入れています。
たくさん打つのが面倒な場合は、適当なテキストファイルにコマンド達をコピーして ; でつなぎ、行コピーでまとめてコピーできるようにすると快適になります。
cd ~/edk2; source edksetup.sh; build
みたいな感じです。
day03a ~ 03b
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day03a
$ cd kernel
$ clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp
$ ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi /workspaces/mikanos-devcontainer/mikanos/kernel/kernel.elf
day03c
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day03c
$ cd kernel
$ source ~/osbook/devenv/buildenv.sh
$ clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp
$ ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi /workspaces/mikanos-devcontainer/mikanos/kernel/kernel.elf
day04b ~ 18a
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day04a
$ cd kernel
$ source ~/osbook/devenv/buildenv.sh
$ make
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/
$ /workspaces/mikanos-devcontainer/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi /workspaces/mikanos-devcontainer/mikanos/kernel/kernel.elf
6章でマウスの動きを実装した際、マウスカーソルが画面の一部でしか動かせないという現象が起きました。 このあと進めていくと直るので、今は放置しましょう。
day18b ~ 24g
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day18b
$ source ~/osbook/devenv/buildenv.sh
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/mikanos/
$ ./build.sh run
day25a ~ 27d
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day25a
$ source ~/osbook/devenv/buildenv.sh
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/mikanos/
$ APPS_DIR=apps ./build.sh run
day28a ~ 30f
$ cd /workspaces/mikanos-devcontainer/mikanos
$ git checkout osbook_day28a
$ source ~/osbook/devenv/buildenv.sh
$ cd ~/edk2
$ source edksetup.sh
$ build
$ cd /workspaces/mikanos-devcontainer/mikanos/
$ APPS_DIR=apps RESOURCE_DIR=resource ./build.sh run
tviewコマンドで日本語が表示できなかったりgviewコマンドでjpgが表示できないことがありましたが、day04とかの昔のところのビルドをした後に試したら普通に表示できました。
なんでだろう
アプリを作ったりしています! よかったらみていってくださいね→
つくったもの
今のイチオシ↓