個人用雑記

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

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

ファイルの分割

今までは一つのファイルに全部書いてきたけど、さすがに長くなってきたので分割。実際、自分で何かのプログラムを書く時も基本的にまずメインとなるファイルに全部書いていって、ある程度たまったら必要に応じたファイルへ分割するって方法の方がやりやすいと思う。(それがいいのかはわからないけど・・・)今回は描画関係のファイル、Day 5で出てきたGDT・IDTとかのファイル、それ以外のファイルの3つに分割。
Makefileがあればコマンドは同じまま複数のファイルを同時にコンパイルできるので特につらいことはない感じ。個人的には分割コンパイルの時は同じヘッダファイルを余計に複数回読みこんで時間がかかるのは割けるようにしなきゃなということは一応毎回気を付けている。(#ifndef等でのインクルードガード)

Day 5の続き

Day 5ではGDTとIDTの初期化をしたかったわけだけど、その説明の残りから。だけど、Day 5でほとんど理解してないままDay 6に来たので前回のとまとめて覚えることにした。

GDT・IDTの初期化

まず、GDTの8バイトの中身とIDTの8バイトの中身を構造体として作成。ここでGDTの8バイトは{セグメントの大きさはどのくらいか、セグメントがどの番地から始まるか、セグメントの管理用属性}をそれぞれ20bit、32bit、12bitで表していて、昔との互換性を保つために各bitを格納する位置についてはいろいろめんどくさいことになっているらしい。IDTの8バイトも基本的には似たような感じ・・・
で、このセグメントの情報を書き込む関数の説明が正直覚えないで毎回読み直したほうがマシという感じの情報量なのでとりあえず諦め。簡単に言えば、それぞれの対応したビットを頑張って建てていく感じ。(そもそも今の時代は64bitだし、知っていても使えるとは限らないのではという感じだし・・・)
とはいえセグメントの情報をどんなふうに書き込むのかのイメージはだいぶついたのできっと大丈夫。作っているのがOSであって渡されるのはプログラムのセグメントの情報ということを念頭に頑張れば理解が少しできた。

PIC初期化

GDT・IDTの初期化と同様にPICというものも初期化しないといけないらしい。PICは各割り込みを発生させるデバイスの割り込み信号をCPUに渡す役目を担っている装置。CPU自体は割り込みを1つしか扱えないから複数のデバイスには対応できなくて、PICのおかげで複数のデバイスに対応できる感じっぽい。初期化の内容自体は基本的に仕様でほとんど決まっていて、特に自分が扱う部分はあんまりなかった。いやまぁ、仕様については全然知らないのだけれど・・・
逆にOSごとに設定するのはデバイスからの信号をそれぞれどの割り込み番号としてCPUに通知するかを決めることくらいで、これはPICがCPUに対しては0xcd(=INT命令) 0x??(=割り込み番号、設定できる)という2バイトの命令を渡して、CPUはこの2バイトの機械語をそのまま実行する仕組みになっているため。
こうしてキーボードやマウスといったデバイスをそれぞれ割り込み番号に割り当てればそれに対応した割り込みを受け付ける関数を作ることができるようになる。

割り込みハンドラについて

割り込みが発生したら対応した関数を呼び出してその関数に実行したい内容を書けばいいんだけど、割り込みの終了時にRET命令ではなくIRETD命令を実行しないといけないらしい、何その命令は・・・
IRETD命令を実行しなきゃいけないけれど、それだけを実行すればいいというわけでも無くて、割り込みが発生したら一回今あるレジスタの中身をとりあえずスタックにPUSHして割り込みに対応した関数が終わったら全部POPするという動作が必要。考えてみれば単純で、割り込みと言っている時点でそれまでの処理は一旦置いておいて後でまた再開できるようにしないといけないから、もし割り込みのせいで中身が変わったまま再開したら大変なことになるというイメージ。
あとは今作成した関数をIDTに登録すればはれて外部装置から割り込みを発生させられるようになる。

割り込みは発生するけど・・・

キーボードからの入力は画面に依存しないのでこれで割り込みが発生していることはわかるけど、マウスの移動についてはそもそも対応したマウスの画像が動かないから全くわからない。この辺のマウスの制御についてはDay 7へ・・・

Day 7へ

Day 5の時よりはGDTもIDTも理解している(気がする)。わからないことだらけであるのは事実だし、特にレジスタの名前と対応した内容はそろそろ整理しないとわからないレベルになってる気がする。
この本を買ってそろそろ20日以上は経つけどようやく7日目に入るという事実が怖いんだけど、この本を本当に30日で終わらせられる人は何者なんだろう・・・