ゼロからのOS自作入門 環境構築~第1章

はじめに

OS自作したくなったので、内田先生の「ゼロからのOS自作入門」をやっていこうと思います。 メインPC(ubuntu)が壊れてしまい、M1 MacBook Proで環境構築しましたが、慣れないDockerを使ったりと大変だったので、備忘録的に記載していきます。 (本にはWindowsでの環境構築方法が丁寧に記載されているので、環境構築に悩みたくない人は素直にWindowsを使う方が良いと思います。M1での環境構築についてもここに先人の方々のすばらしいやり方が載っているので、M1しかなくて環境構築に困りたくない人はそっちを参照した方が良いと思います。)

手順

今回はDockerの勉強も兼ねているので、Dockerを使ってubuntu環境を構築してその上で開発していきます。

1. sudoユーザ&GUI操作可能なubuntuコンテナを作成

最終的にはqemuで動かしてGUIも表示させるようなので、以下のサイトを参考に環境を構築します。

上記方法で環境構築するとrootで操作することになってしまうので、以下のサイトを参考にDockerコンテナ内にsudoユーザを作りました。

コンテナの起動とかはDocker DesktopでGUI操作するのが一番楽だと気が付きました。(いちいちコンテナID覚えるの面倒。。。)

f:id:nitomo71:20210831172851p:plain
DockerDesktop

ユーザにログインするには、

  1. Docker Desktopからコンテナを起動

  2. Docker DesktopでCLIを開く

  3. 以下コマンド実行してユーザ名とパスワードを入力

sudo login

でログインできます。

2. 公式の手順をなぞる

mikanos-buildを上から順番に実行していきます。

ansible-playbook -K -i ansible_inventory ansible_provision.yml

を実行すると、以下のようなエラーがでますが、今のところとりあえず問題なさそうです。

TASK [check whether qemu-system-gui exists] ************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["dpkg-query", "--show", "qemu-system-gui"], "delta": "0:00:00.012730", "end": "2021-08-14 20:36:49.313362", "msg": "non-zero return code", "rc": 1, "start": "2021-08-14 20:36:49.300632", "stderr": "dpkg-query: qemu-system-gui に一致するパッケージが見つかりません", "stderr_lines": ["dpkg-query: qemu-system-gui に一致するパッケージが見つかりません"], "stdout": "", "stdout_lines": []}
...ignoring

手順を進めていくと、edk2のビルドでエラーになります。

In file included from /usr/lib/llvm-7/lib/clang/7.0.0/include/stdint.h:61:
/usr/include/stdint.h:26:10: fatal error: 'bits/libc-header-start.h' file not found
#include <bits/libc-header-start.h>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
GNUmakefile:331: recipe for target '/home/osdev/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/MikanLoaderPkg/Loader/OUTPUT/Main.obj' failed
make: *** [/home/osdev/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/MikanLoaderPkg/Loader/OUTPUT/Main.obj] Error 1


build.py...
 : error 7000: Failed to execute command
    make tbuild [/home/osdev/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/MikanLoaderPkg/Loader]


build.py...
 : error F002: Failed to build module
    /home/osdev/edk2/MikanLoaderPkg/Loader.inf [X64, CLANG38, DEBUG]

- Failed -
Build end time: 00:10:43, Aug.15 2021
Build total time: 00:00:05

調べてみると、以下のサイトでも同様のエラーが報告されていました。

fatal error: 'bits/libc-header-start.h' file not found【mikanos】

上記のサイトを確認すると内田先生が以下のようにコメントしているらしいですが、

通常は $HOME/osbook/devenv/x86_64-elf以下に置いてあるはず。

自分の環境ではそもそもそのファイルはありませんでした。

osdev:~/osbook/devenv$ find -name libc-header-start.h
osdev:~/osbook/devenv$

再度、内田先生のコメントをよく読んでみると、"x86_64-elf以下"とあり、もしかしてと思い"uname -a"してみると

osdev:~/osbook/devenv$ uname -a
Linux 77cc22babb26 5.10.25-linuxkit #1 SMP PREEMPT Tue Mar 23 09:24:45 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

となっており、mikanosの環境構築の前提としてアーキテクチャx86_64なのではという仮説が生まれました。

なので、以下のサイトを参考にビルドし、手順1からやり直しました。

Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする

上記のサイトでは、オプションを有効にしないとbuildxkコマンドは使用できないような記載がありますが、最新のDockerをインストールしてあれば、"buildx"コマンドは使用できました。

ちゃんとx86_64のイメージで起動できていると、以下のように表示できると思います。

$ uname -a
Linux bedb80ac310c 5.10.25-linuxkit #1 SMP PREEMPT Tue Mar 23 09:24:45 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

気を取り直して再度手順を進めていくと、最後の最後で失敗しました。

osdev:~/mikanos$ ./build.sh 
/* 省略 */
+ /home/osdev/osbook/devenv/mount_image.sh ./disk.img ./mnt
+ [ 2 -lt 2 ]
+ dirname /home/osdev/osbook/devenv/mount_image.sh
+ DEVENV_DIR=/home/osdev/osbook/devenv
+ DISK_IMG=./disk.img
+ MOUNT_POINT=./mnt
+ [ ! -f ./disk.img ]
+ mkdir -p ./mnt
+ sudo mount -o loop ./disk.img ./mnt
mount: ./mnt: mount failed: 許可されていない操作です.

以下のサイトをみると、オプションをつけないとマウントできないようです。

Dockerコンテナ上でイメージファイルをマウントする

ってことで、最終的にビルトと起動にはそれぞれ以下のコマンドを使用しました。

  • ビルド

    $ docker buildx build --platform linux/amd64 -t ubuntu:osdev -f Dockerfile .

  • 起動

    $ docker run --privileged -it -e DISPLAY="xxx.xxx.xxx.xxx:0" --platform linux/amd64 ubuntu:osdev

以下の画面が表示されたので、いったん環境構築は完了です。

f:id:nitomo71:20210831185322p:plain
mikanos

1章

hexeditというバイナリエディタを使用してみました。 このエディタ、新規ファイルが作成できないので、事前にtouchコマンドとかで空ファイルを作成してから編集する必要がありました。 (最初emacsで書いてて、途中からhexeditを使うような編集方法にしたら起動できるファイルは作れましたが、CRCの計算が合わなくて、いろいろ調査したけどよくわからず最終的にtouchコマンドで空ファイル生成、hexeditで編集でちゃんとしたやつが作れました)

f:id:nitomo71:20210831190306p:plain
mikanos hello world

これから

とりあえず時間を見つけて今後も少しずつでも進めていきたいと思います。 また、ある程度進んだらブログ書こうと思いますが、特に躓くことがなければ完成報告のブログになるかも。