A20ゲートについて

A20ゲートについて学習したため、そのまとめとしてここに整理する。


A20ゲートとは

  • x86アーキテクチャをベースとするCPUが持つ回路のひとつ。
  • 「有効」・「無効」の2種類の状態を持ち、20bitで表すことが可能なメモリ領域以上の領域にアクセスするためには有効にする必要がある。

背景

  • 従来の8086プロセッサは16bitCPUであったため、レジスタの幅は16bitであり参照できるメモリ空間にも制限があった。(216 = 65,536bytes = 64KB)
  • この制限以上のメモリ空間を参照するため、2つのレジスタを使用しそれぞれ「セグメント」「オフセット」といった情報を保持し、最大1MBのメモリ空間への参照を可能としていた。(segment << 4 + offset = 216 * 24 = 64KB * 16 = 1024KB = 1MB)
  • 1MBのメモリ空間を参照するために、8086プロセッサには20本(1MB = 220)のアドレスバスが用意されており、それぞれA0 ~ A19とされていた。
  • その後、8086よりもアドレスバスの幅が拡張された80286(24bit)や80386(32bit)が登場し、より広いメモリ空間を参照できるようになったが、アドレスバスの数の差により8086との互換性がなくなり、80286や80386で動かせるプログラムが8086では動かせなくなってしまった。(80286や80386で表すことができるアドレスを8086で表そうとすると20bitではオーバーフローし、正しいメモリアドレスを参照できないため)
  • このため、A20以降のアドレスバス(21番目以降のアドレスバス)を有効にするかどうかを制御する回路(A20ゲート)が追加され、1MB以上のメモリ空間を参照するためにはこの回路を有効化することでより大きなメモリ空間を参照することとし、16bitプロセッサとの互換性が維持された。

有効化する方法

  • キーボードコントローラから
    • キーボードと直接関係はないが、当時空いていたポートがキーボードコントローラに存在していたため割り当てられたそう
  • BIOS割り込み(INT 15)から