2010年2月28日日曜日

「作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」3章再び

「作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」3章再び

セグメントディスクリプタに関して3章にはアセンブラでの記述があります。

dw 0xFFFF ; limit:0xFFFF
dw 0x0000 ; base 0~15ビット
db 0x01 ; base 16~23ビット
db 0x9A ; P:1, DPL:0, Code, non-conforming, readable
db 0xCF ; G:1, D:1, limit 16~19ビット:0xF
db 0x00 ; base 24~32ビット

これをC言語のデータ構造として表現してみると


typdef struct _segdesc { /* 合計 8バイト */
    unsigned short limit_low;
    unsigned short base_low;
    unsigned char  base_mid;
    unsigned char  type;
    unsigned char  gd_and_limit_high;
    unsigned char  base_high;
} segdesc;
という感じです。セグメントのベースアドレスは3つに分かれてます。最初は
unsigned short型のbase_low、次はunsigned char型のbase_mid、最後は
unsigned char型のbase_highです。インテルはリトルエンディアンなので、
unsigned short型の場合、下位バイトが下位アドレス、上位バイトが上位アド
レスになります。つまり、base_low, base_mid, base_highを各バイト単位で見
ていくと、下位バイトが下位アドレスに必ずあります。

過去のまとめについてはこちらです。