ぐだぐだ低レベルプログラミング(252)x86(32bit)、失われた常識? PEビット

Joseph Halfmoon

前回、CRレジスタについて書いた時、つい「常識」と思って通り過ぎてしまいました。しかし、もしかして今時の若者(中年も)には知られていないかも、と思いなおして1回追加です。CR0のLSB、PE(プロテクトモード・イネーブル)ビットのクリアについて。知らなくても全然問題ないケド、パソコンとx86の奥底に残っている仕様。

※「ぐだぐだ低レベル プログラミング」投稿順indexはこちら

LMSW命令ではPEビットをクリアできない

前回、80386以降のプロセッサで装備されるようになった32ビットの制御レジスタCRxレジスタのうち、CR0の下位16ビットは80286のときから存在し、MSWと呼ばれていた件書きました。80286では32ビット幅のCRレジスタのアクセス命令は存在しないので、専用のLMSW命令で値をロード、SMSW命令で値をセーブです。PEbit

32ビット化以降のCR0でも16ビット時代のMSWでも下16ビットには同じ制御ビットが見えているわけです。ここに小ネタあり。

LMSW命令でPEビット(プロテクト・モード・イネーブル)を立てることはできるが、クリアすることはできない

一方、80386以降のプロセッサがそなえる32ビットの「MOV CR0, なんたら」使えばPEビットをクリアすることは可能です。

80286においてプロテクト・モードを設計したヒトは思っていたのです、多分ね。

一度プロテクト・モードに入ったら、リアル・モードに戻ることなどない

ソフトウエアのロジックの美しさを考えたら、あるべき姿じゃないでしょうか。「プロテクト」されている世界から脱獄して「なんでもあり」な世界に戻るなど言語道断。でも実際にはそうはなりませんでした。今にいたるパソコンのハードウエアの礎となったIBM PC/AT(IBM互換機市場が爆発的に成長した。CPUは80286)においては、リアル・モードからプロテクト・モードに入って大きなメモリ(といってたかだか16Mバイト)を扱った後、あろうことかリアル・モードに戻って入出力などコマケー仕事をやるプログラムが多数でてきてしまったのです。全てをプロテクト・モードで書き直せればよいのですが、既にDOS上のリアル・モードで動くプログラム多数、BIOSもリアル・モード、拡張ハードを制御するドライバなんかもリアル・モードってな具合。結局、「初期の」プロテクトモード使ったOSやスーパバイザの多くがリアル・モードと行き来して処理をすることになってしまったのです。汚いけどショウガナイ。

そのときプロセッサである80286は、ソフトウエアではいったん立てたPEビットをクリアできない(LMSW命令のみ)仕様でした。それでどうしたのか?

走っている最中にリセットかけてリアル・モードに戻った

そのとき使われたのが、キーボードコントローラとして登載されていた8042マイクロコントローラ(マイコン)です。年寄がざっくりしたブロックダイアグラムを書くとこんな感じ。PCAT_8042

PC/ATの分離型のキーボード本体には、8048(インテルの8ビット・マイクロコントローラ)が登載されており、キーをスキャンしてます。結果をシリアル通信でメインボード側に送ってくるのですが、これを受け取るために8042(同じく8048系の8ビット・マイコン。8048との違いとして、ホストプロセッサのバスの先っぽに取り付けてIOとしてアクセスしやすいインタフェースを持っていた)が「いた」のです。こいつを読むことでホスト・プロセッサ(80286)は押されたキーを知ったわけです。なお、いまではこのようなマイコン(ROM/RAMつんでプログラムで動いていた)は撤去されて、ハードウエア回路化されてる筈です。知らんけど。

ここで年寄はピンとくるんじゃないかと。悪名高い?「CTRL+ALT+DEL」キーによるキーボード・リセットっすね。キーボードそのものはシリアルで接続しているだけなのに、PCにリセットかけられるっと。これは8042の出力ポートの一本が80286のRESETをつつけるように構成されていたためにできる技でした。

一方、ホストである80286が8042に「お願い」すれば、自分自身にRESETをかけてもらうことも可能っす。ヤバイね。プログラム走らせている最中にRESETかけるのよ。これはハードウエアの信号をトリガしているのでPEビットを初期化しゼロ・クリアすることが可能です。まあ、RESETかかったときに表面上、プログラムの流れが断絶しないような手当は多いに必要ですけど、リアルモードに戻れる。荒業デス。

80386以降ではPEのソフトウエアによるクリアもできる

上記のハードによるリアルモード復帰は、オーバヘッドもデカいです。それでも初期のプロテクトモード・プログラムは1秒間に何百回もRESET使ってリアルモードに戻ってました。

流石にそれはマズイだろ~、ということになったのか。80386で新設されたMOV CR命令つかってPEビット操作するときには、このビットのクリアを許すことになったとさ(互換性のためLMSW命令ではクリアできないまま。)よって以降ではモード間の行き来が大分楽になったとか、ならないとか。今となってはリアルモードに戻ったりしない(本来の姿)から、ドーでもよい話なんだけれども。

なおPEビットを立てるにせよクリアするにせよ、ビットのON/OFFだけで済む話でもないです。モード遷移のためのしかるべき手順(インテルのマニュアルに書いてあるもんね)を踏まないといけない。ちとメンドイ。

ぐだぐだ低レベルプログラミング(251)x86(32bit)、コントロール・レジスタ へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です