2009年7月20日月曜日

IA32のA20ゲートについて

A20ゲートについて、ちょっと見てみよう。
適当に、ここでメモして後で、整理してHPにアップするつもり
(ほとんど書籍『作りながら学ぶOSカーネル』の内容だけど
この本、日本語がちょっと変でよみづらいのと
誤植が多いのが欠点だなぁ。内容は良いけど)


■アドレス指定について
・8086時代
CPUのアドレスラインは0番~19番までの20本、レジスタは16ビット
0x0000:0000~0xffff:ffffの範囲で、物理アドレスで
示すと、0x00000~0x10FFEF(0xffff0 + 0xffff)となる。
0x10FFEFは、2進数で、1 0000 1111 1111 1110 1111となる。
アドレスラインが20本なので、最上位ビットを除いた
0000 1111 1111 1110 1111(16進数では、0xffef)となる。
要するに8086では、アドレス指定(セグメントとオフセット)を使用し
1MBを超えた場合、0番地からになってしまう。


・80286時代以降
8086との互換を可能にする為に、A20に、当時のキーボートコントローラチップ
である8042の1つのピンとともにANDゲートで繋いでいる。

1MB目を指定した場合、
A20ゲートがOFFだと

1MB = 1024x1024 = 0x10 0000 = 1 0000 0000 0000 0000 0000[2進数]

常に20番目が0になって次のようになる。
(ここでは最上位ビットの1が0になってしまう)

0 0000 0000 0000 0000 0000[2進数] = 0

A20ゲートがONだと、A20の値がAND演算されて
(ここでは最上位ビットの1と1がAND演算されて1になる)

1 0000 0000 0000 0000 0000[2進数] = 1MB


32ビットで、1Mバイト以上のアドレス指定を正常に
行うには、常にA20ゲートをONにしなければならない。

[参考書籍]
はじめて読む486、OS自作入門、作りながら学ぶOSカーネル、

0 件のコメント:

コメントを投稿