A20以上のアドレスバスを有効にする
テスト環境(Hyper-V, QEMU)では常に有効なので後回しで。
実機で動かす時に考える。
/icons/hr.icon
A20 がすでに有効になっているかどうかをテストします。有効になっている場合は、何もする必要はありません。
BIOS機能を試してください。返されたステータスは無視してください。
A20 が有効かどうかをテストします (BIOS 機能が実際に機能するかどうかを確認するため)
キーボードコントローラーの方法を試してください。
タイムアウトのあるループで A20 が有効かどうかをテストします (キーボード コントローラー メソッドの動作が遅くなる可能性があるため)。
最後に Fast A20 メソッドを試してください
ループ内で A20 が有効になっているかどうかをタイムアウト付きでテストします (Fast A20 メソッドは動作が遅くなる可能性があるため)。
上記のどれもうまくいかない場合は、あきらめてください
/icons/hr.icon
問題
直接データを書き込んでテストする方法と BIOS の応答を見る方法の2種類が存在する。どちらを使う?
確実なのはデータ書き込み。
BIOS は停止したり、暴走したり、不定値を返してくる可能性がある。
データ書き込みを試した後に BIOS を試すのは不合理。一方、BIOS を先に試しても、失敗ケースも含め、正しい結果が返ってくる保証がない。
データの書き込み場所はどこを使う?
安全な書き込み場所は本質的に存在しない。なぜなら、周回していなかった場合に全然異なる場所に書き込まれてしまうため。
ブートストラップの時点ではIPLしか動作していないため、まず問題がない。
真面目にフローを考えたらこうなるはず…
(Recommended Method と Final code example の流れが食い違っている…)
https://mermaid.ink/svg/pako:eNp1kltvgkAQhf8KmSdN0MCCSHloo7EapOKtL23pwwprNQGWcElLkf_eBQVJxX3anTnfmTnJZmBTh4AGe5d-2wccxtzrxPI5dkadZx_vXMKNkMDNcEy4VUhtEkXdXu9xnOlR2ThrnKf8DI1Z7_RGohP30plQn3QbZZOeOL3gxvpyy22TIKBhfEX1Gl18_J-8S0vo86xcMKV5ZwGzfQGzWmCdTXEUl-TNBuuaXTYKBbXJDJLuKA6dW2pTU_NGoaCWjWDFe96WqzK-ZJszsXEnm9GezajntflXcS_-SyZe3fFfXf0bhcJ51pniI1OyicCDR0IPHx32a7JCZ0F8IB6xQGNXh-xx4sYWWH7OpDiJ6Tb1bdDiMCE8JIHD9poc8VeIPdD22I1YNcD-O6VeJWJP0DL4AU156IsqGqqyjIaCIksSDyloPRHJal8ZSKIkKkgUVEnKefgtHVBfkZGEJJm1BoIqo_wPwFvcFg#.svg
Hyper-V, QEMU では、最初から A20 のアドレスバスが有効になっていた。
現代のBIOSでは最初から A20 が有効になっている。
A20 が無効な時のみ A20 を有効にする必要がある。
いくつかのバリエーションが存在している。
歴史的順序
キーボードコントローラーを使う。
遅いことが知られている。(そんなに?)
BIOS でサポートされているかどうかを判別することができるようになった。
BIOS コールを使う。
INT 15h AX=2401h SYSTEM - later PS/2s - ENABLE A20 GATE
Hyper-V では異常値が返ってくる?
問題
BIOS コールが実際に使えるかどうか、どう判断すればよいか?
関連
参考