30日自作OS本でいままでやったことまとめ~10日途中まで~

初めに

この記事は自作OS Advent Calendar 2019 - Adventarの16日目の記事です。

どんな記事をかいたの?

自作OSのアドベントカレンダーどころか、アドベントカレンダー自体初めてとなります。つたない文章ですがよろしくお願いします。

今回の記事は、自分がやってきたことを見返すために、今現在までにやってきた失敗、楽しさ、使用しているツールを覚えている限り赤裸々に書くつもりです。と言ってもまだ10日の途中までしか終わっていませんが…。今回の記事で30日自作OS本をやってみようという方への、少しの足しになれば幸いです。

あと、関係ないですがNim1.0が今年の9月の終わり当たりに公開されました。いまだとNim1.0.4になり、ほんとめでたい!

目次

なぜ始めようと思ったか

当時はseccamp(割と行き当たりばったりで応募したので落ちて当然だった)に落ちたこともあり、実機にUbuntuを入れることや技術本を読む、いろいろなイベントに応募することで技術を得なければ!と焦っていた毎日でした。いま思えば、自分が本当にやりたいことを探していたのかもしれません。その際に参加したsubup_campにて、OSとELFフォーマットへの知識を高めたいことを目的として自作OSを選択した次第です。

その後、10月あたりにsubup_campで自作OSをやっている方がすごく楽しそうにやっていたのをふと思い出したので再開してみました。そしたら、その…はまっちゃいまして… 底なし沼のようで抜け出せそうにないです(抜け出す気がない)

Linux編(途中で挫折)

使用ツール

OS:Ubuntu19.04 LTS
エディタ:Vim
バイナリエディタ:ghex
仮想マシンQemu-system-i386
アセンブラ:NASM
CコンパイラGCC

1日目(Linux)

この時はLinuxで作成していました。しかし、知識と自作OSの界隈での情報をうまく探し切れていなかったために、知識不足のまま技術習得のショートカットを考えてしまっていたということを覚えています。まぁ…要するに、著者のツールなしかつLinux環境で完成させようとしていたんですよね。この日に陥った困難はすごい単純で、Vimでの操作がいまいちわかっていなかったのと、ghexで0のコピペがうまくゆかなかったことですね。一応1日目に関しては終えることができました。

2日目(Linux)

アセンブラの前提知識に関しての記載が、多くなってくる日にちでした。すこし、アセンブラに触れているようで知識が充実してゆく楽しさを実感した覚えがあります。この日も無事に終わりました。

3日目(Linux)

最初の挫折しかけた日でした。悩みの種だったのが、Vimの設定でMakefileでTABを半角スペースで入力していたといったミスですね。書籍をよく読んでいれば気づけたのに…。あとは、著者のツールを使っていなかったため、下に記載したブログの方のリンカスクリプトを参考にやっていました。

bttb.s1.valueserver.jp

4日(Linux)

ここ以降は、記録があまり残っていなかったみたいです。なので、コードと記憶を頼りに記録してゆきます。

この時のソースコードを見た感じ、未完成で次に進んでいるものが多い感じですね。予定通りに日にちを消化することができていなくて、焦っていたのかな…。

5日目(Linux)

このあたりからVimに慣れていないこと、初心者故のタイポが多くなっている気がします。また、デバッグのやり方を知らなかったのでコードを見つつ、一つの日を消化するのに何日もかけていたことがうかがえます。

6日目(Linux)

これが最後の記録になっています。harib03aが最後となり挫折したようです。C言語の知識が少ないままやっていたこともあり、アセンブラで書いた関数を呼び出すのに多く失敗しています。

なぜ挫折したか

これを考えなければ無駄な時間を過ごしてしまったことになりかねませんから、考えてみます。

まずは知識が不足しているかつ、やる期間を決めているのに著者のツールを使わないという選択肢を選択してしまったことが間違いの要因の一つです。では、なぜ著者のツールを使わないという選択肢を選んでしまったかということを考えてみると

1つ目は、自分の知識がどの程度で何ができるのかを推し量れていなかったことにあります。要するに、ショートカットできないのに無理矢理ショートカットしようとして挫折してしまったことです。

2つ目は、始めるにあたり、著者のツールを使わない方面でしかLinuxでの自作OS本をやる方法を見つけ出せなかったことになります。これに関しては、自分のサーチ不足なので何とも言えないですが、要因の一つと感じました。

これらに対しての解決策を考えてみた結果

1つ目の解決方法はwindowsで無理なく著者のツールを使ってやるということと、日程を決めるなら決めるで、自分の知識でどのくらいかかりそうかに関して考え日程を考えておくべきでした。

2つ目の問題点の解決方法は、自作OSをやっている方に積極的に尋ねるべきだったと思います。自作OSのコミュニティとしてOSdev_jpがあるので、参加してみるといろいろな方に質問できるかと思います。また、hikaliumさんが、各種OSに対応するtoolkitを以下のページで公開されていますので、活用するといった手立てがあったかと思います。

hikalium.com

Windows

一日目に関しては、Linuxでやったことと同じになりそうだったので割愛。
使用ツール
OS:Windows10
エディタ:VScode
比較ツール:WinMerge
他:30日自作OS本付属の著者のツール群

2日目

このころから、ふとOSdev-jpで、ふと目にしたWinMergeを使い始めます。これはソースコードを比較し、誤記があれば指摘してくれるツールです。写経をやるときにすごく便利です。

この日は、アセンブラに関しての前提知識を学ぶことができました。まだ、書き慣れてないのか写経ミスが多かったみたいですが、WinMergeのおかげでソースコードをじろじろみることなく完走することができました。

no000.hateblo.jp

3日目

この日は、アセンブラで書いたブートローダーとC言語でOSで行う処理を書き始めてゆく日でした。特に問題なく進めている感じです。DB命令とDD命令の書き間違いが目立っていたようです。

no000.hateblo.jp

4日目

画面表示を行うために、アセンブラで指定のメモリに書き込みを行う処理を記述してC言語でデータを教える流れで、画面表示を行っていますね。この辺のイメージってFreeDOSとかでメモリ上のVRAMを直接いじるとわかりやすいんじゃないかなと、後々思いました。

後は、NASKのアセンブラ言語やC言語の基礎的な文法が多く記載されていて、楽しみつつも時間がかかったことを覚えています。特にポインタの説明がわかりやすかったですね。
また、30日自作OS本のBIOS等の仕組みを参照するサイトが以下のサイト移動しているみたいです。

oswiki.osask.jp

no000.hateblo.jp

5日目

この日から構造体が出てきます。また、GDTとIDTの話なので最初の難関と言われていますね。実際、自分はすごく時間がかかりました。ですが、C言語の知識やアセンブリの知識、OSがどのように動いているかの知識が徐々に増えていったことを覚えています。

no000.hateblo.jp

6日目

ソースコードの整理を行ったのちに、GDTとIDTのやり残したことの整理を行っているみたいです。

ここでは、GDTにおける管理属性の説明で感動したんですよね。プロテクトリングの図は見たことあったのですが、OSでどのように管理しているかを知らず消化不良のような気分になっていたのですが、すごいすっきりしたことと興奮したことを覚えています。

IDTの説明で、OSが周辺機器からの信号をどうさばいているかについて、知ることができたのも面白い要素でした。

5日目と6日目は難しいですが、面白い内容でもあるので時間をかけてやってみるのが充実した時間にすることができるかと思います。

no000.hateblo.jp

7日目

マウスを動かすために、キーボードの調整を行っていますね。ここから割込み処理を本格的に記載してゆくことになるのですが、バッファといったデータ構造の話や割込み処理をどうやって素早く終わらせるかといったことの説明が多く。いろいろ調べるきっかけとなりました。

また、構造体の重要性に気づき始めます。

以下のサイトがキーボードの制御回路の仕様を理解する上で参考になりました。

softwaretechnique.jp

no000.hateblo.jp

8日目

このあたりから、自分はソースコードを読む力が少しずつ上がり始めてゆくのを感じました。そう言うこともあり、これ以降のGitHubはてブロにのせているコードが、コメントだらけのクソコードと化してます…(心配性なので後から理解できないんじゃないかと怖くて)。

この日ではマウスがどのようにして動かすことをできるようになるかを学ぶことができました。そして、最後に32bitモードへの道において説明を後回しにしたアセンブラの説明があるのですが、ここが一番難しく・面白い内容でした。リアルモードからプロテクトモードに移行するにあたりレジスタやメモリ、CPUをどのように動かすかが知れ、興味深い内容となっていました。

no000.hateblo.jp

ブログの記事、よく見たらソースコードがぐちゃぐちゃですね…今後直さないと…

9日目

この日、自分にとっての難関はメモリ管理でした。最初、メモリ上でどのように整理しているのかと考えてしまっていたのですが、メモリを管理するための構造体で作られた表があるということを理解してからは理解が早かったです。書籍内で最初に説明しているのがページング方式で後に解説してるハリボテOSに採用したのがセグメント方式になる…?かと思っています。(知識不足なので断言できない)

no000.hateblo.jp

10日目

まだやっている途中なのでまとめることができていないですが、さっそく作成したメモリ管理の仕組みを利用し重ね合わせ処理の内容を記述していく流れですね。重ね合わせ処理の仕組みも、わかりやすく解説されていました。

最後に

途中経過としての感想

長々と、にわかが書いた日記みたいになってしまったかもしれません(すみません)。

読んでいただきありがとうございました。30日自作OS本は焦ることなく行えば、非常に楽しく学ぶことと、遊ぶことをすることができる書籍なのではないかと思われます。

また、最近FreeDOSに触れることがあったのですが、16bitOSってメモリの動きや動作が非常にシンプルでわかりやすいと感じました。なので、DOS系のOSに触れてみるのもいいのではないでしょうか?(FreeDOS1.3が開発中みたいです)

今後

GitHubに上げるにあたり今後改造していくであろうOSはBaseOSという名前にしました。ありきたりですが、自分の今後、学ぶことのすべてのベースになればいいなって塩梅です。で、30日自作OS本を完成させたら、Nim言語に書き換えるか、64bitに対応させたり、UEFI対応、ページング方式と夢が踊りそうです。

おまけ

自分はNim言語で自作OSをいずれ書きたいと思ってはいるのですが、なかなかNim言語をやっている方が少ないようで…

もし興味のある方がいれば、Nim言語の日本フォーラム(最近はあまりアクティブではないようですが…アクティブにしていきたい)がDiscordにあるので、招待URLを発行できます(参加者全員が発行できるみたいなので)。TwitterのDMか、ツイートに流すでもしようかなと思います(どちらの方がいいか悩み中)。少しでもNim言語の話題で話せる方が増えればいいな…