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

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

目標を次のように設定。

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

 

・・・・・

本日は、マウスカーソルを動かすために行った「GDTとIDTの初期化」の中で、説明が途中だったので、そこからスタートのようです。

◆ やり残した説明。

もう一度、harib02h と harib02i を開きなおして、眺めるところからです。

GDTとIDTを初期化する上で、セグメントの設定を行って、変数gdtと変数idtを決めたことを思い出しました。それから、セグメント1番と2番の設定。それと新しい演算子。。。

“naskfunc.nas”の説明から。

「_load_gdtr」:指定されたリミットと番地を、GDTRという48ビットのレジスタに代入するためのもの。

このレジスタの下位の16ビットは、リミットを表していて、「GDTの有効バイト-1」のこと。残りの上位32ビットの部分で、GDTが置いてある番地を表している。

最初は、DWORD [ESP+4]にリミットが、DWORD [ESP+8]に番地が入っている。0x0000ffff と 0x00270000。これを1バイトずつ切って表すと、「FF FF 00 00 00 00 27 00」

最初の0xffffをMOV AX, [ESP+4] で読み取って、それを[ESP+6]に書き込んでいる。それで、「FF FF FF FF 00 00 27 00」となり、[ESP+6]から読み込ませれば、上手くいく。

⇒この辺り、まだまだ理解できていない・・・。

 

“bootpack.c”を分割した”dsctbl.c”にある、「set_segmdesc」の説明。

分割すると、”bootpack.h”も並べるから確認しにくい・・・。

「set_segmdesc」:セグメントの情報をCPUの仕様に沿って、8バイトにまとめて書き込む関数。その内容は、

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

「struct SEGMENT_DESCRIPTOR」という構造体を準備。

セグメントの番地、CPUの世界の言葉では、セグメントのベース番地。変数名「base」
baseは「low(2バイト)」「mid(1バイト)」「high(1バイト)」の3カ所に分断されている。合計32ビット。
3箇所分断しているのは、80286時代のプログラムとの相互性。

リミット「limit」。セグメントが何バイトかを表している。20ビットしか用意されていないが、セグメントの属性にGビットというフラグをつけて、フラグを1にすると、リミットをページ単位と解釈する(1ページが4KB)。
これで、4KB × 1M = 4GB。

セグメント属性、セグメントのアクセス権とも呼ばれる。「access_right」とか「ar」という変数。
12ビットのセグメント属性のうち上位4ビットは、limit_highの上位4ビットに入れる関係で、このプログラムでは、arをあえて16ビットとして、

xxxx0000xxxxxxxx (xの部分は、0か1)

arの上位4ビットは「拡張アクセス権」と呼ばれる。この4ビットは「GD00」という構成で、GはGビット、Dはセグメントのモード、1だと32ビットモード、0だと16ビットモード。D = 1が普通。arの下位8ビットは、80286時代からあったセグメント属性。

 

・・・・・

セグメントの説明は中ボス級の難しさとのこと。確かによくわかりませんでした。よくわからないのに、時間だけが経ちました。こういうのが続くとへこみますが、とにかく先へ進む。わからないことはチェックだけして後回しにします。

以上。

スポンサーリンク