リアルモードへの復帰
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/07/24 08:50 UTC 版)
「Intel 80286」の記事における「リアルモードへの復帰」の解説
80286で、DOSやBIOSの資産を継承しつつ、更に仮想記憶機能を生かすためにはリアルモードとプロテクトモードの間を往復することが必要だが、80286にはプロテクトモードからリアルモードへの復帰命令が無く、復帰にはCPUのリセット信号線を有効にするしかなかった。そのため、80286搭載機では特定のI/Oポートを操作することによりCPUのリセットパルスを発生させるハードウェアを持っており、ソフトウェアからCPUのみのリセットを行うことができた。BIOSの初期化プログラムの中で通常のハードウェアリセット(電源ONまたはリセットスイッチ押下)と前述のソフトウェアリセットを区別し、初期化方法を切り替えるという処理が必要だった。これら一連の処理はオーバーヘッドが大きいため、結果的に80286を用いたリアル/プロテクトモード間のスイッチングは非効率的なものとなった。 なお後継の80386以降では、両モード間を任意に往復できる機能や仮想86モードなどを備えていた。 リアルモードへ戻るための方法はハードウェア独自のものとなっており、具体的な手順は以下のようにハードウェアによって異なる。 IBM PC/AT 80286を搭載したIBM PC/ATではキーボードコントローラのI/Oにリセット機能が搭載されていた。これはI/Oポート64hにあり、通例はFEhを書き込みそのbit0を0にすることでリセット動作となる。これに先立ち当該プログラムはリセット後に処理を再開するアドレスCS:IPをBIOS Data Areaの0040:0067hに保存する。それ以外のスタックの位置(SS:SP)などプログラムの動作継続に必要な情報は当該プログラム自身のデータ領域などに保存する。次にリセット後の動作を決めるシャットダウンコードをRTC用 不揮発性CMOSメモリのオフセット0FhにI/Oポート70h, 71hを使用して書き込む。5を書き込めばリアルモードへの復帰、0を書き込めば通常の電源ON、またはリセットスイッチ押下である。プロテクトモードから戻るとBIOSはBIOS Data Areaに保存したアドレスから当該プログラムの実行を再開させる。当該プログラムはあらかじめ保存しておいたスタックの位置などの情報を戻す。 NEC PC-9800シリーズ PC-9800シリーズでは1986年に登場したPC-9801VXに80286とV30の両方が搭載され、このとき80286とV30を切り替えるためのリセット用I/Oポートが設けられている。該当機ではI/O 00F0hに0を出力することでCPUがV30に切り替わらずにリセットされるが、これに先立ちリセット後に処理を続行するか再起動するかを事前に設定しておく必要がある。この設定はI/O 0035hのbit5,7にあり、再起動の場合は両方のbitを1に、処理続行の場合はbit7を0に設定する。処理を続行する場合は事前に戻りアドレスとなるCS:IPをスタックに保存(PUSH)したうえで、そのスタックの位置(SS:SP)をメモリアドレス0000:0404から0407までの4バイトに保存しておく必要がある。
※この「リアルモードへの復帰」の解説は、「Intel 80286」の解説の一部です。
「リアルモードへの復帰」を含む「Intel 80286」の記事については、「Intel 80286」の概要を参照ください。
- リアルモードへの復帰のページへのリンク