
80386のアーキテクチャ(2) - 動作モード
さて80386のレジスタについて書きましたが、次は動作モードです。
80386のアーキテクチャ(1) - レジスタ
80386は80286と同様にリセット時にはリアルモードと呼ばれる8086互換の状態からスタートします。この状態ではメモリ保護も動作せずすべての特権命令が実行できます。但しアドレス空間は先頭の1Mのみしかアクセスできないので、ファームウェアやBIOSといった最初に実行するコードはこのアドレスの範囲内に置く必要があります。
これからプロテクトモードに移行するのであれば、プロテクトモードに必要な各種テーブルのセットアップを行います。
286のプロテクトモード - 仮想アドレス
準備が整ったところで、CR0のMSWにあるPEビットをセットしてfar jumpを実行して(これで命令キューもクリアされる)プロテクトモードに移行します。
; set PE bit
mov eax, cr0
or eax, 1
mov cr0, eax
; far jump (cs = selector of code segment)
jmp cs:@pm
@pm:
; Now we are in PM.
さあ、これでプロテクトモードに入りメモリ保護された32ビットのメモリ空間が使えるようになります。80286ではプロテクトモードになるとリアルモードに戻る方法は基本的にはなかったのですが(このためリセットをかけて電源投入時なのかリアルモードに戻るためなのかを判別する仕組みをCPU外部に備えていた)、80386では単にPEビットをクリアすることでリアルモードに戻れるようになりました(必要なレジスタの設定は忘れずに)。
80286と80386のプロテクトモードには他にも大きな違いがあります。レジスタが32ビットとなり一つのセレクタ(セグメント)で4Gのアドレス空間を使うことが出来ます。このため64K毎に区切られたチマチマとしたメモリを管理する必要も無くなり、基本的にはセレクタを切り替えなくても良くなりました。これで他のアーキテクチャのCPUとの親和性が良くなり8086であることを意識することも少なくなりました(near や far ともお別れです)。
付け加えることとして仮想記憶の実装として80826では64K単位だったのでセレクタ単位で外部記憶とやりとりすれば充分だったのですが、80386で4G単位となるので、その全てをやり取りするのでは大変です。そこでページングという一定のサイズの物理メモリのアドレス空間毎に外部記憶とやり取りする仕組みも備えました。これはCR0にあるPGビットをオンにすることで有効に出来ます。これでプロテクトモードの使い勝手がかなり良くなりました。
ページング方式
さて、80386ではさらに仮想86モードという動作モードも用意されました。プロテクトモードとリアルモードをいったり来たり出来るようになったので、8086時代の過去の資産を活かすことが容易になりました。しかしリアルモードはリアルモードです。1Mを超えるメモリにはアクセスできないですし、多少の工夫はできるもののメモリ保護もなくシステムに対してやりたい放題です。
当時、リアルモードはMS-DOSを動かすためにこそ必要だったのですが、リアルモードで何らかのトラブルに見舞われると再起動しか打つ手が無いことが当たり前でした。これでは386の高度な機能も宝の持ち腐れです。そこでタスクの一つとしてリアルモードの「ような」動作をする仕組みを用意して、これをプロテクトモードから使えるようにしたのが仮想86モードです。
仮想86モード
今で言うところの仮想マシンのひとつですが、この仕組みを使うことでMS-DOSを使うことが出来るようになり、メモリも潤沢な1Mより上のアドレスから1M分(まで)を割り当てて使うことができます(ページングも有効です)。さらにこの仮想マシンは複数使うことも出来るのです。もちろんリアルモードではないので、割り込みなど微妙な処理がありますが、そこを頑張ることでなんとかする方法が提供されたわけです。
はじめて読む486 第11章 仮想8086モード
仮想86モード拡張(VME)考察

この仕組みはWindows以前にもDOSエクステンダと呼ばれた1M以上のメモリを使ったり複数のDOSプログラムを切り替えて使うにも使われ、互換性を保ちつつ今までのソフトを活用できる形で80386は普及していきました。もっともせっかくの32ビット機能は限定された形でしか使われず、これらの上で動くソフトの大部分は16ビットのままでした。本格的な32ビット時代の到来にはもう少し時間がかかりました。
Intel 80386 Reference Programmer's Manual
ヘッダ画像は、この記事をプロンプトにしてAIで生成しました。
いいなと思ったら応援しよう!
