よもぎのメモ帳

備忘録的な感じで技術的なことをストックしていきます。

よもぎのOS自作入門 3日目/30日

はじめに

これは2020年夏休み企画「30日でOS自作してみよう!」3日目の記事です。

企画についてはこちら

y0m0g1.hatenablog.com

いい感じのサムネイル画像は明日以降作ろうと思いますもうそろそろ諦めてる。

昨日やったことを書いていきます

昨日の進捗

f:id:y0m0g1:20200820160152p:plain
進捗1:Hello Worldを表示しない

エラーが起きたらエラーを表示する→エラーがないので何も表示されない

f:id:y0m0g1:20200820160219p:plain
進捗2:真っ黒画面

グラフィクスモードになったものの、何も表示していないのでむしろ進捗がぱっとみマイナスになってるように見えるっていう。

でもFD*1を10シリンダ分*2読み込んだり、ブートセクタからOS本体を実行させたり、C言語導入したりしたから!

昨日やったこと

まずディスクを読み出す動作をアセンブリで書きました。ディスクBIOSを呼び出すのです。 最初1つのセクタだけ呼び出していたものを、JMP系命令,ADD命令,CMP命令を用いることで読み込むセクタ・シリンダを増やし180KB分読み込むようにしました。

次に、ブートセクタからOS本体を呼び出して実行するようにします。 つまり、今まで書いてきたアセンブリファイルはブートセクタ部分であり、これからは他のファイルにOS本体部分を書いていって、これをブートセクタから呼び出すのです。

試しにOS部分を生成して、それをブートセクタと一緒にしてイメージファイルを生成するプログラムに投げます。 そのイメージファイルをバイナリエディタに投げ、どの様にマッピングされたか把握します。

; 試しに書いたOS本体(何もしてない)
fin:
    HLT
    JMP fin

把握してから、ORG命令で正しくメモリにマッピングできるようにして、OS本体もグラフィックスモードに移行するという内容を追加します。

さぁ、これで真っ黒な画面が表示されます…… が、真っ黒な表示にならない。 進捗1みたいなままです。なんで。 ここで結構手こずりました。

参考本は「配布しているファイルをそのまま使って、どんどん進んじゃってください。ファイルの変更点は本に書いてあるので、注意して読んでね」のようなスタンスです。 でも配布されているファイルはコメントが文字化けしている*3し、 それだけだと私の場合適当に流しちゃいそうだ*4と思って、自分の手でプログラム書いています。 そしたら、サイレント修正――つまり、本に書いていない変更点――がちょいちょいあって、全くOS本体部分に行っていなかったという…… アセンブリの命令語って2~3文字だし、大文字で書きがちで見分けつきづらい!

わかって、直して、真っ黒な画面になったときには嬉しかったです。何も表示されないのに喜ぶの何?

最後に”32ビットモードの準備”とC言語の導入に移ります。

BIOSは16bitで扱うけれども、C言語から生成する機械語は32bitモードで生成するので拡張していきます。 ちなみに今BIOSの後継として用いられるUEFIは32bitモードと64bitモードがあるらしい*5

C言語にはHLT命令に当たるものがないので、HLT命令をループさせるときには、naskで書いてCのプログラムに読み込ませるとかやりました。

3日目でやっとC言語に触れて、高級なんだなぁって感じになってきました。

今日も一日頑張るぞい!

*1:フロッピーディスク、私は小学生の時にエレクトーン教室で使ってたよ

*2:10周分

*3:Shift JISで書いてあるけど、私のVS codeではデフォルトがUTF-8解釈で開くようになっている

*4:これは本当

*5:wiki調べ(英語)