OSの勉強していたら、理解できないところが出てきました。
「64KBと640KBの壁」とは何でしょうか??
これに関連する「A20ゲート」とは何ですか??
教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
64KBの壁、1MBの壁、640KBの壁
x86が16ビットだった時代、(以前も触れたように)アドレスは「セグメント」と「オフセット」という2つの16ビットの値で表現していました。そして、オフセットだけ変えてアクセスできるのは16ビットのアドレス空間=64キロバイトで、これを超える場合にはセグメントも変更するなど、プログラム的にも特別な対応が必要となりました(64KBの壁)。
また、セグメントとオフセットはバラバラな値ではなく、「セグメント×16+オフセット」という式で計算していたため、合計しても20ビット分=1MBまでしかアクセスができませんでした(1MBの壁)。そして、多くのMS-DOSではこのうち384KBをBIOSやI/O空間としていたので、メモリは残り640KBとなっていました(640KBの壁)。
A20とHMA
そして、8086の時代にはアドレス空間が本当に20ビットしかなかったので、セグメントを0xfff0など最後の方に合わせることで、オフセットの操作だけでBIOS自体(ふつうの計算でアクセス)と、割り込みなどの下位メモリ(アドレス計算を桁あふれさせる)をまとめてアクセスする、というようなことが行われていました。
ところが、286ではリアルモード以外にプロテクトモードが登場し、プロテクトモードではアドレス空間も1MBを超えて広がったのはいいのですが、アドレス計算にバグがあって、リアルモードでも「セグメント×16+オフセット」の計算が桁あふれせず、1MBを超えたメモリにアクセスしてしまう、ということが判明しました。桁あふれを利用していたプログラムとの互換を図るために、アドレスバスの21ビット目(0から数えるのでA20)をCPU外部で強制的に0とする回路を付けて凌ぐこととしました。
その後、積極的にA20を使うことで、リアルモードのまま1MBの壁を超えた64KB弱のメモリにアクセスする「HMA」という手法も登場し、386以降ではこのアドレス計算が正式な機能となって、現在に至っています。
※以上の文章の「キロバイト」「メガバイト」はすべて、1024基準で計算したものです。
最後に
気になったことを逐一聞くより、そろそろMS-DOS、あるいは16ビット時代のx86について1冊本を読んでしっかり勉強したほうがいいかもしれません。
投稿2016/08/27 08:15
総合スコア145121
0
レジスタ長が16ビット時代の話です。
レジスタ一個で指し示す値の範囲は2の16乗=65536=64Kなので、これがメモリアクセスにおける一つの壁でした。それで、2個組み合わせる方法が考案されました。が、2の32乗ではなく、2の20乗=1Mが次の壁でした。ただし、1Mも全ては自由に使用できず実質は640Kの壁となりました。
A20ゲートは新しい時代とこの時代との互換性のためのものです。当時の一部のプログラムは上位桁の桁あふれを利用する(例えば1M+100番地以降のメモリ領域にアクセスしようとすると、100番地をアクセスする性質を前提としていた)ものであったため、新しい方式でもこのやり方になるように調整するものです。
投稿2016/08/28 12:25
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。