「OSを作れる」「仕組みが学べる」という言葉に惹かれて、プログラミング軽くかじった程度の私が、OSを自作しようと思い立ちました。

2019年の目標の一つは『OS自作入門でOSを作る』です。

目標を次のように設定。

「2019年3月31日までに、完読してわからないなりにもOSを自作してみよう。」

 

・・・・・

◆ harib02i (GDIとIDTの初期化)

マウスカーソルを書いたので、マウスを動かしたい。だからまず、GDIとIDTの初期化。

GDI、IDTはCPUの設定。

しかし、今の “asmhead.nas”に書いたプログラムでは設定ができない。だから、ちゃんと設定をやり直すそうです。

著者の言うことには、

できるだけアセンブラを使わずに、C言語で書いてみせたいと思ったのです。だってそのほうがみなさんも分かりやすいでしょう?だから asmhead.nas では最大限の手抜きをして、bootpack.cを動かすための準備だけにしておいて、まともな利用のためには、今回のように再設定するわけです。

 

そうですね、最大限の手抜きをしてもらえて良かったです。初期の全く分からない状態で難しい設定をされるよりは、今のほんの少し分かるようになった状態で、その都度、設定してもらった方が納得できます。

著者さん、ありがとう。

 

・・・・・

マウスを使うためには、割り込みを使えるようにならないといけない。だから、IDTを設定しないといけない。

IDTは割り込み番号0から255に対して、割り込み番号123が発生したら〇✕関数を呼び出してね、みたいな表で設定方法はGDIに似ている。

IDTの設定には、セグメントの設定がきちんと完了していないと困るので、GDIを設定する。

「セグメンテーション」:合計 4GBあるメモリを好きなように切り分けて、それぞれのブロックの最初の番地を0として扱えるという機能。複数のプログラムが同時に動いた時に、メモリの利用範囲が重なったりしないように。

セグメントの1つを表すには次の情報が必要。

  • セグメントの大きさはどのくらいか。
  • セグメントがどの番地から始まるか。
  • セグメントの管理用属性(書き込み禁止・実行禁止・システム専用など)

セグメントの指定の仕方。グラフィックのパレットと同様の方法。
セグメント番号があって、セグメントレジストにセグメント番号を入れる。
セグメント番号は、0~8,191が扱える(CPUの仕様の関係で使えるのは13ビット)

このセグメントを設定する64KB(のメモリ)のことをGDTという。

 

「GDT」:「global (segment) descriptor table」大域セグメント記述表。セグメントの設定を並べて、その先頭の番地と有効設定個数をCPUのGDTRという特別なレジスタに設定する。

 

「IDT」:「interrupt descriptor table」割り込み記述表。CPUには外部の状況や、めったに起きない内部のトラブルなどが起こると、臨時で処理を切り替えさせる機能がある。それが割り込み機能。

 

「SEGMENT_DESCRIPTOR」:GDTの8バイトの中身。
「GATE_DESCRIPTOR」:IDTの8バイトの中身。(共にCPUの資料を参考に書いたもの)

変数gdtに0x00270000を代入しているのは、0x270000~0x27ffff番地をGDTに決めた。
変数idtについても、0x26f800~0x26ffff番地をIDTにしている。

gdtはox270000で、iは0から8,191まで1ずつ増える。C言語ではポインタに足し算をするときには、掛け算を行っている。gdtという変数は、SEGMENT_DESCRIPTORという8バイトの構造体へのポインタだという宣言になっているので、gdtに1足すと、番地は8増えている。

 

<新しい演算子>

ar |= 0x8000; ar |=ar | 0x8000; の省略表記。演算子 | はOR演算。
limit /= 0x1000; limit = limit / 0x1000; の省略表記。演算子 / は割り算。
演算子 >> は右シフト演算子。ビットを右にずらす。00101100 >> 3は、00000101。

 

・・・・・

この章、「難易度が高く、雰囲気だけでもつかんで、」と著者が書いていたけれど、本当にわからないので、メモも写しになってしまいました。

とにかく、「マウスを使えるようにするには、CPUの設定をしなくてはならなくて、それはアセンブラを再設定すること」というのはわかった。

ようやく『本書』でいう5日目が終了。

先は長い。

 

以上。

スポンサーリンク