なんか最近面白いことがないしつまらないなーと感じていました。
そんなときにmacbookのbootcampだとwindowsのスリープの復帰遅いけどなんでなんだろうなー、OSとかそこらへんの対応の問題なのかなーとか考えていました。
そしてふと、なんかOSを自作する本とかこの前見かけたよなと思い出しました。
それでググってみると「ゼロからのOS自作入門」を見つけました。


4000円くらいしてちょっと高いなーと思ってブックオフやヤフオクで調べると3000円弱で買えそうな感じでした。
けれどそこでそういえば電子書籍とか買ったことないなー、電子書籍ってちょっと安くなかったっけ?と調べました。
すると紙の4000円より300円くらい安いだけでそんな安くないことがわかりました。
けれどなんかクーポンとかありそうと調べてみると、初回は70%オフで最大1000円引きだとわかり、3700-1000=2700円くらいで中古とあまり変わらないなと思っていたところ、amazonギフト券が1500円分余っていたことを思い出して、これなら1200円で買えるじゃんと思って買ったのでした。

前にゼロから作るDeep Learning2を買って一応一通り流し読みしたけどやっぱり個人でchatGPTは作れないのかと挫折したことを忘れてまたゼロから作る系の本を買いました。
また心に余裕ができたらリベンジしてみたい気持ちは少しあるんですけどね。

今回はOSの自作ということですごく難しそうですが、パソコンのソフトウェアの根本を理解できそうで面白そうと感じました。
少し読んでみるとやっぱり結構難しそうで、特にLinux系の話とかさっぱりなので理解が追いつけるか心配です。
けれどまあその時はその時で、ゼロから作るDeep Learning2的に最後までさらっと流し読みはするつもりです。
とりあえずなるべく手を動かして読み進めていこうと思います。

ここにメモとかを書き残していこうと思ってます。

35ページ 第一章のHello World!のエミュレータでのやり方

これは一番最初のPCでの作業なんですけど、いきなりWSLとQEMU、Xサーバを使うことになり戸惑いました。
付録Aを読んでWSL、VcXsrvをインストールしました。
https://github.com/uchan-nos/mikanos-build/
ここからリポジトリもクローンしました。

WSLは付録Aには何個かコマンドを打たないといけないっぽいんですけど、
https://learn.microsoft.com/ja-jp/windows/wsl/install
このサイトでwsl --installだけで済みました。
何か違うんですかね。
そのあとQEMUはどうやってインストールするんだろうと思って読み進めていたら特にQEMUをインストールするコマンドがありませんでした。
どこかで何かと一緒にインストールしていた?
それとも戸惑っていろいろやっていた時にインストールをしていた?

ディスクイメージとかVcXsrv, QEMU, WSLとかそこらへんの理解がまだあいまいな感じですね。

あと私はLinuxはほとんど触ったことがないのでコマンドがたくさん出てきてものすごい時間がかかりました。
さらに29ページのバイナリの入力。
これも細かいところで打ち間違えていて何回か見直しました。
このBOOTX64.EFIのファイルも最初はwindows上で作っていて、それをBOOTフォルダに入れようとしたら権限がなくて入れられませんでした。
home\usernameのところにはコピーできたのでそこにコピーして、そこからsudo cpコマンドで移動させました。
これでcpコマンドは覚えたのでばっちりです。

それでずっとHello World!が表示されなかったんですが、ついに、やっと、表示されました!
やった!!
35ページのディスクイメージを作成するコマンドは5回以上入力してますね。。
もうすでに疲れた。

あとバックスラッシュ\は改行のコマンドだったんですね。
改行のコマンドであることは何となく知っていたんですけど、改行しなくても入力していいのかとか使い方をよく知らなかったので少し躓きました。

そのあとのページで10進数と2進数の説明になり、難易度の高低差に耳がキーンとなりました。
やっぱり自分で実際にやるのは環境構築とか細かい部分で動かなかったりするので難しく感じますね。


第2章 2.2 49ページ EDK IIでハローワールド(osbook_day02a)


今度はgitタグについてです。
gitとか全然使ったことないのでここでまた躓きました。
と、おもったら付録Bを読んでなかっただけでした。
ここでworkspaceにgit cloneするとか書いてありますね。
付録Bを参考にインストールするとか書かれていた部分を読み飛ばしてしまったんですかね。

細かいですけど
git tag -l
のあと抜けられませんでした。
ctrl+Cじゃなくてqで抜けられるんですね。

50ページ
bulidをしたら以下のエラーが出た。
error 4000: Instance of library class [RegisterFilterLib] is not found
ググったら以下にたどり着いた。
https://zenn.dev/kanataso/scraps/d39c9d10d16cee
$ cd $HOME/edk2
$ git checkout 4ac0296
これで直った。
なんか最近のバージョンのデータだとバグってしまうらしい?


2023/6/21
62ページの2.7まで読んだ。
メモリマップの確認のコードの部分はさらっと読み流した。
git checkoutでコードをダウンロードしてコマンドで実行した感じ。

Linuxとgitのコマンドの勉強になった。

第3章 画面表示の練習とブートローダ

P.85の適当な模様をフレームバッファに描くところで躓きました。
何回も実行してもP.83のフレームバッファを白で塗りつぶした画面しか表示されません。

今まで丁寧にコマンドが書かれていたのですが、少しずつ省略されて”カーネルを起動すると”という風に表記されるようになりました。
ずっと本に書かれたとおりに考えずに打ち込んでいたのであれ?となってしまいました。

そこでこのコンパイルなどの定型的なコマンドをまとめておこうと思います。
最後に一応まとめておきました。


整理してみたらいろいろ初歩をちゃんと理解できていないことが分かりました。

第二章ではまだEDKという開発キットを使ってブートローダを作っている段階でした。
そこから第三章ではついにカーネルを作り始めます。
そのため第三章からはカーネルとブートローダの両方をそれぞれビルドしないといけないということです。

あともう一つ、git checkoutも理解していませんでした。
なんかよくわかんないけどgit checkoutをすると各章の対応したコードになるっぽいという理解でした。
そこで勘違いしていて、git checkoutすればコードとか全部その章に対応したものに更新されると思っていました。
けれどよく考えてみるとgit checkoutの前にcd $HOME/workspace/mikanos をしていたので、mikanosのフォルダ内しか更新されません。
あとバージョンを-fで強制的に戻すと更新されないファイル以外は残るっぽい?
そのためkernel.elfがあってもそのバージョンのものとは限りません。
それでcheckoutしたらもう作成済みのkernel.elfがあると勘違いしていました。

なので何度も読み直してカーネルとブートローダをそのバージョンごとで作成しなおしたら白い画面から模様のついた画面がやっと開きました。

いやー、gitもlinuxもいろいろ初めてで理解しないといけないことがたくさんです。

それで第四章に進んだらc++の説明がたくさんありました。
いろいろ読み飛ばして、というかコード書かずにgit checkoutしてるだけでとりあえず先に進んでいました。
コードの理解よりgitやlinuxコマンドの使い方に慣れることを優先して、なんとなくこんな感じに機能を追加していくんだなーという風に読んでいました。
それで第5章にたどり着いてprintkまで読みました。

途中ピクセルで何か自分で絵を描いて表示させてみたいと思いました。
それで線を描く関数を作って何か大きく描こうと思っていたらなんかめんどくさくなってやめました。

今度はやはり実機で起動させたいと思いました。
けれど学校で使っているPCは壊れたりするとまずいのであまり使いたくなかったので、家にあった2011年の古いPCを使おうと思いました。
それでSSDとUSBメモリを買って実際に試してみました。
(書いたらリンク張る)




使ったコマンドとかのメモ

・タグの切り替え
cd $HOME/workspace/mikanos
git checkout osbook_day(ここに番号)

・カーネルの場所
(main.cpp, kernel.elf)
cd $HOME/workspace/mikanos/kernel

・ブートローダーの場所
(Main.c)
cd $HOME/workspace/mikanos/MikanLoaderPkg
(Loader.efi)
cd $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64

・カーネルのコンパイル
P.73
clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp

P.85
clang++ $CPPFLAGS -O2 --target=x86_64-elf -fno-exceptions -ffreestanding -c main.cpp

・カーネルのリンク
ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o

・ブートローダーのビルド
cd $HOME/edk2
source edksetup.sh
build

・ブートローダーでカーネルを起動
cd $HOME/edk2
$HOME/osbook/devenv/run_qemu.sh Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf

・カーネルのmake (コンパイルとリンクをまとめたもの)
cd $HOME/workspace/mikanos/kernel
make

・カーネルのmake+ブートローダーのビルド+実行(これをコピペで全部一括でできる)
cd $HOME/workspace/mikanos/kernel
make
cd $HOME/edk2
source edksetup.sh
build
$HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf

シェルスクリプトとか作ろうかなとか思ったけどめんどくさくてこれをコピペしてます。