FAQ(よくある質問とその回答)
よく聞かれる質問とその回答をまとめます。読者の皆さんが質問するときは Issues にお願いします。
開発環境はなんですか?
本書が想定しているのは x86-64 版の Ubuntu です。Windows(WSL)上で動かした Ubuntu にも対応しています。ビルドに Nasm や LLVM を使うので、それらが動作する環境が必要です。Docker を使った開発は未検証です。
開発ツールを Ubuntu にインストールするためのスクリプトを https://github.com/uchan-nos/mikanos-build で公開しています。このスクリプトは Ansible で動作するようになっていて、中身は APT で Nasm や LLVM などをインストールしたり、EDK II をダウンロードしたり、設定ファイルに設定を追加したりします。Ansible を用いず、スクリプトの内容と同等の手順を手動で実行すれば Ubuntu 以外のディストリビューションにも開発環境を整えられるかもしれません。
Mac でも開発できる?
筆者は未検証ですが、読者の方がやり方を調査してまとめてくださっています。Intel CPU でも Apple Silicon でも(少なくとも 2 章前半までは)動作するようです。 Mac での開発環境の整え方は いろんな環境でビルド、実行する方法に関するリンク集 を参考にしてください。
※筆者も、各記事の作者も、記事に記載された手順で絶対に動作するという保証はしていません。自己責任でお試しください。
自作 OS を動かすにはパソコンの初期化が必要?
いいえ、そんなことはありません。自作 OS をエミュレータ(QEMU)で動かす場合も、USB メモリにインストールして起動する場合も、パソコンに元々入っている環境を壊すようなことは、原則としてありません。安心して試してください。
原則として、というのは、例えば USB メモリに自作 OS をインストールするつもりが、誤って内蔵 SSD を上書きしてしまうかもしれません。あるいは、自作 OS にデバイスドライバを追加しようとして、プログラムが暴走して周辺機器を壊してしまう、というようなことが無いとは言えませんからね。(ある意味、周辺機器を壊せるレベルのデバイスドライバを書ければ、OS 自作人としては誇って良いと思いますけども)
本書を読み進めるのに C++ の経験が必要?
いいえ。C++ の経験や知識がなくても、他のプログラミング言語の経験、知識があれば十分だろうと思います。それほど C++ の込み入った機能をばりばり使っているわけではありません。また、C++ 固有の知識はある程度本書の中で解説するように心がけました。
プログラミング経験が一切無いと、本書のコードを理解するのは難しいかもしれません。もし、本書が初めてのプログラミング経験だ、という方は、本書を読んだ感想を聞かせていただけると筆者が喜びます。
アセンブリ言語の知識は必要?
いいえ、前提としていません。 アセンブリ言語は必要最小限の量だけ登場しますが、アセンブリ言語を知らない前提で解説を書いてあるので、心配しないでください。 もし本書の解説だけでは分からない場合でも、必要に応じて調べていくのがお勧めです。
理解できるか不安です
本書は、ちょっとずつ解説&実装して実行するという流れで進んでいきます。 とりあえず理解できるところまで進むということが可能です。 完成形がどーんと示され、その各部分を説明するという形式に比べて、全体がまったく分からないという可能性が低くなっています。
Raspberry Pi でも動作する?
いいえ、できません。 本書で作る OS は x86-64 アーキテクチャ専用の OS です。 x86-64 を採用した Intel Core シリーズや AMD Ryzen などの CPU が搭載されたパソコンが必要です。
Raspberry Pi は ARM という CPU が搭載されており、MikanOS は動作しません。
FAT32 ではなく exFAT でフォーマットする理由は?
図1.8 で exFAT を選んでいるのは、筆者の環境では FAT32 が選択肢に無かったからです。
ここでの要旨は「NTFS を選ばない」ということであって、「FAT32 ではなく exFAT を選べ」ということではありません。 exFAT でフォーマットすると起動できないけど、FAT32 では正常に起動した、という報告を複数いただいていますので、FAT32 を選ぶ方が安全かなと思います。
Windows はどうやら、FAT32 でフォーマットできるサイズの上限を 32GB までとしているようで、筆者がその時使った 64GB の USB メモリでは FAT32 が選択肢に出ませんでした。
ln -s コマンドでリンクの修正ができません
本書では $HOME/edk2 に MikanLoaderPkg という名前のシンボリックリンクを作ります。
ln -s
の引数を打ち間違うなど、意図しないリンクを作成してしまった場合、再度同じコマンドを実行してもエラーになってしまいます。
解決方法は これだけは知っておきたい Linux コマンド の rm の節 を読んでください。
Linux の各種コマンドの意味は何ですか?
ls や cd、ln など、本書で使用するコマンドや相対パス、変数といった概念などの説明をまとめていますので、確認してください。 これだけは知っておきたい Linux コマンド
RegisterFilterLib 関係のエラーで MikanLoaderPkg がビルドできません
EDK II で MikanLoaderPkg をビルドしようとしても次のようなエラーが出ることがあります。
/home/uchan/edk2/MikanLoaderPkg/MikanLoaderPkg.dsc(...): error 4000: Instance of library class [RegisterFilterLib] is not found
in [/home/uchan/edk2/MdePkg/Library/BaseLib/BaseLib.inf] [X64]
consumed by module [/home/uchan/edk2/MikanLoaderPkg/Loader.inf]
エラーの解消方法は主に 2 つあります。
- 古い EDK II を使う方法
- 2021/04/08 にエラーの原因となる変更が EDK II に導入されたので、それ以前のバージョンを使うことでエラーを回避できます。
- 具体的には次のコマンドを実行します。
$ cd $HOME/edk2 $ git checkout 38c8be123aced4cc8ad5c7e0da9121a181b94251
- MikanLoaderPkg.dsc に RegisterFilterLib を追加する方法
- MikanLoaderPkg.dsc を修正すれば最新の EDK II でビルドできるようになります。
- 変更の内容 https://github.com/uchan-nos/mikanos/commit/b5f7740c04002e67a95af16a5c6e073b664bf3f5
- kernel/Makefile の修正は Clang 14 に対応するための記述であり、RegisterFilterLib のエラーとは関係ありません。