M2Macで「ゼロからのOS自作入門」

カテゴリー: まなぶ
投稿日:
更新日:
書いた人: 山椒ねこまんま

M2Macで「ゼロからのOS自作入門」(通称:みかん本)のMikanOSを動かしたので、環境構築やビルドコマンドをまとめました。

こちらの VSCode Devcontainer 設定ファイルを使ったのでとっても簡単にできました! ありがとうございます!

初期準備

こちらにアクセスし、右上の Use this templateCreate a new repository を押します。

ローカルに落としたら、VSCodeで開きます。

ターミナルに、

git clone https://github.com/uchan-nos/mikanos.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

(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とかの昔のところのビルドをした後に試したら普通に表示できました。
なんでだろう


アプリなどを作ったりしています! よかったらみていってください→ つくったもの
今のイチオシ↓