個人用雑記

勉強したことを書いていければなーと

30日でできる!OS自作入門(Day 4)

C言語入門

さすがにC言語は多少わかるので流し読みで飛ばした。

ポインタについて

ポインタも(自分的には)ある程度理解している(と思っている)ので、読み飛ばそうかとも思ったが、ちゃんと読んだ。僕も最初にC言語を勉強した時は何言ってんだこれ?適当にやったら動いたけどどうしてなのか全然わからんwといった感じで、1年後くらいになってようやく少しずつ理解ができたかな・・・

とくにpとp*の違いについてを、アセンブラでいうECXという"レジスタ"と[ECX]というECX番地の"メモリ"なのかという点で大きく異なっているという説明は、非常に的を射ていながらも初学者にもわかりやすい説明ですごいと感じた。
またちょっと前にTwitterでバズっていたa[2]と2[a]という書き方は本質的に同じという部分も、そりゃそうだよな~と納得ができる感じ。

画面の色

BIOSで指定したモードは8bitカラーモードなので255種類しか色を用意することができない。ただ8bitカラーモードでは0~255に対して対応する色番号をプログラマーが勝手に決められるそうで、例えば色番号0を#000000、色番号255を#ffffffのように決めることが可能。
筆者曰くOSらしい画面にはとりあえず16色あれば十分だとか・・・(これは当時のWindowsがXPとかその辺だったからなのでは・・・)
あるに越したことはないけど、設定方法がわからないのでこれもいつか自作OSを作る時まで投げとこ。

色番号の設定

画面の色が255種類で表さなければならないけど、色自体は指定できることはわかった。ただ色番号を設定するのはC言語だけでは足りなくて、別のアセンブラを書かなければならない。色番号の対応表自体はとりあえずRGBの3つに分けたものを配列に入れるだけ(つまり16色であれば[16 * 3]としてr,g,b,r,g,b...の順に入れていく)で大丈夫。次にこれをアセンブラで書いた関数に渡していくことで色番号の指定が可能になる。
で、肝心のアセンブラで何を書くのかというと、番号で指定した装置にデータを送るという行為。そして画面出力に対応した番号にさっき決めた色番号を送ることで色番号の設定ができる。

ただし、この色番号の設定をしている間は割り込みを禁止しなければならず、割り込みを禁止するためにはその前に現在の割込み許可フラグの値を記録しておく必要がある。(もしかしたらすでに禁止であったかもしれないのでね・・・)今回でもまだ割り込み処理とは何かには言及されなかった。ちなみにこの割り込みフラグはEFLAGSという特別なレジスタの第9ビットが担当しており、やはりアセンブラでなければこの値を読み書きができない。
そしてEAXレジスタに直接EFLAGSの値を入れる命令は存在しないのでここで急にスタックが出てきた。スタックにEFLAGSをPUSHしてそこからEAXへPOPするという動作を通してEAXへEFLAGSの値を入れられるようにしているらしい。

こうして色の指定ができるようになったことでカラフルなOSモドキを作成できるようになった。
f:id:rei_624:20190416021228p:plain

色がつくとさすがに進捗が生まれた気になる。自分では何もしてないのだけれど。

色がついたら当然それっぽい見た目になるように配置することもできる。
f:id:rei_624:20190416021907p:plain

もちろん今は押してもキーボードを触っても何も反応しない本当の意味でのはりぼてOSだけれども。
でもなんか、これを見ると16色じゃ少なくない・・・?という気になるのは僕だけなのだろうか。

Day 5へ

5日目は構造体と文字表記とGDT/IDT初期化らしいけど、ついに聞いたことのない単語が来てしまった。はやめに理解できると、いいな・・・