i0kyoto’s diary

Creator Pro・Fusion360・ルアー・Co2レーザー

自作OS入門(6日目→2日目)

6日目のLGDTレジスタ操作でつまづいた。
LGDTレジスタに6バイトのデータ(2バイト-リミット、4バイト-アドレス)
をセットしなきゃダメってのは理解したけども。

具体的にはp123のアセンブラ記述がしっくり来なかった(2日目の内容忘れた)

ので、もう一度レジスタ関連をまとめてみる。

 

BYTE  -  1バイ
WORD - 2バイ
DWORD ー 4バイ


16ビット(2バイト)レジスタ

AX - アキュムレータ
CX - カウンタ
DX - データ
BX - ベース
SP - スタックポインタ

「[ESP+6]から読み込めば、ちょうどうまく行く」って言うのが理解出来てない。
アセンブラで書いてみたら、「そういうものか!」で納得出来る?

まぁ、ここでのポイントはセグメントのテーブル領域を0x00270000~0x0027ffffに設定したよってことがわかれば8割OKなのかも。

次、セグメントの構造:
セグメント構造体は大別すると3つにカテゴリされる。
セグメントの大きさ:low-2byte, mid-1byte, high-1byte
リミット:20ビット(4GBを表すためにページビットがある)
セグメント属性:12ビット(書き込み禁止・実行禁止なんかを指定する)

セグメントとページの概念と言うか使いかたが「おぼろげ」だけど見えてきた感じ。
時間が出来たら、この辺まとめたいなー