|
MMU調査のためのメモ。あと記憶の整理。 MMUの目的は、物理メモリの効率的な使用とプロセスの保護であり、プロセッサの機能を使ってOSがこれを実現する。ユーザプログラムは普通はMMUの存在を意識しないでよい。 8bitプロセッサの時代からもMMUはあった。6809にMMUを追加したパソコンは富士通FM-11,77,77AV以降、日立S1がある。これは64KBしかないアドレス空間を拡張する目的で使われた(FM-11の場合1MBまで)。6809+MMU前提で作られたのがOS-9 Level2だった。 Z80の上位互換である64180はバンク切り換えの回路を内蔵して対応していた。たしか最大512KBまで扱えたはず。80系のパソコン(PC-8801,X1等)は外部回路によるバンク切り換えばかりだった。 16bitプロセッサになって68000は特権モードとユーザモードを備えた。これはメモリ空間の保護である。ユーザモードで異常事態が発生したら特権モードに移行し処理する。プログラムが暴走してメモリを破壊されるのを防ぐ。のちの68010で特権モードによる保護は完全となる。外付けのMMUチップもあった。68030からは内蔵された。 一方の80系は、8086ではアドレス空間が20bitに拡張されただけで保護などはなかった。80286でプロテクトモードが追加され、メモリ空間はセグメントと特権モードにより保護された。80286用のXENIXが動作しているのを見た事がある。これはマイクロソフトが作ったUNIX互換OSだ。ただしMS-DOSユーザからは不評で、いったんプロテクトモードになると8086のモードに戻れない。戻るにはリセットするしかなかった。そのため外部回路でリセットして戻るように細工された。80286設計者は不本意だったろう。これは次の80386で、仮想86モードといってプロテクトモードの管理下で動く8086の動作モードが追加された。しかしこれも予想外の使われ方をする。プロテクトモードで扱えるメモリ空間をアクセスして仮想86モードから扱えるようにしたソフト(EMM386)でMS-DOSから使われるようになったのだ。なかなか本来の性能を発揮させてもらえないのだった。 MMUはページ・テーブルという論理アドレスと物理アドレスの変換表をメモリ上に持つ。CPUにはページ・テーブルの先頭を差すレジスタを持つ。ここから変換表をたどっていって、プログラム上で扱うアドレスを実際のメモリ上のアドレスに変換する。変換する単位(ページ・サイズ)は4KBが一般的だが、組み込み系は1KB、ハイエンドになるともっと大きなページ・サイズを扱える。各ページ・テーブルには物理アドレスと論理アドレスの対応、Vビット(有効かどうか)、保護モード(特権/ユーザ)、読み書きの許可、プロセス間の共有の許可などの情報を持ち、32bitアドレス空間(4GB)以上の物理メモリを持つプロセッサでは64bitで表現される。 論理空間が実装している物理メモリサイズよりも大きなことがある。こんなときは使っていないページのメモリ空間をディスクに退避(スワップ・アウト)する。必要になればディスクからメモリに戻す(スワップ・イン)。これらはOSが管理し、プログラムは意識しない。ただしあまりにも論理空間の要求が大きすぎると頻繁にスワップを繰り返すスラッシングを起こしてしまい、時間を取られて本来のプログラム実行に支障をきたす。組み込み系ではスワップ自体を起こさないようにしないと致命的なタイムアウトを起こす可能性がある。また退避先となるディスクを持たないこともある。組み込み系ではMMUはプログラム実行の保護に使うのが有効。 MMUは頻繁に参照されるのでメモリ上にあるのはちょっと効率が悪い。そこでTLBが用意された。ページテーブルの頻繁に使う領域のコピーを持ち、プロセッサ内部でヒットすればそこで変換が行われる。なければTLBミスとなり、メモリ上のページ・テーブルからコピーされ再度参照される。この仕組みはスワップ・イン、スワップ・アウトと似ている。TLBの構造はキャッシュメモリと似ているが、高速性が求められるためフルアソシエイティブで構成されることが多い。そのかわりエントリサイズがあまり大きくできない。 論理アドレスの最大値と物理アドレスの最大値は同じである必要はない。x86は論理アドレスは32bitの4GBまでだが、物理アドレスは拡張されて36bitまで参照できる。これは物理メモリさえ積んでいればより多くのプロセスを走らせることができる。最近のパソコンはそろそろOSが64bitへ移行しようとしているが、実装しているメモリは1GB〜12GBくらいとちょうど32bit境界の前後あたりでばらついている。ここからしばらくは論理アドレスの最大サイズが物理アドレスのサイズを超えるだろう。 |
| << 前記事(2010/02/05) | ブログのトップへ | 後記事(2010/02/10) >> |
| タイトル (本文) | ブログ名/日時 |
|---|
| 内 容 | ニックネーム/日時 |
|---|
| << 前記事(2010/02/05) | ブログのトップへ | 後記事(2010/02/10) >> |