大昔の
MMU
(Memory Management Unit)
2017.JUL.22
たけおか@AXE/たけおかラボ
@takeoka

1.「リレーショナルデータベースを内在するカーネルプログ
ラム、方法及び装置」
●
かなり広範囲に適用される…
●
データベースをカーネル空間内で動作させる
●
特許番号【特許第5711840号】
●
登録日 【2015年3月13日】
●
株式会社ネクスティエレクトロニクスと、
たけおかラボ株式会社との共同特許
●
2.「アプリケーションに依存することなくファイルにアクセスする
OSプログラム及び方法」
●
データファイルに、データへのアクセス手続きを、くっつけておく
●
OS API経由で、データファイル内のアクセス手続きを呼び出す
●
どんな形式のファイルでも、データの読み書きができる
●
特許番号【特許第6143038号】
●
登録日 【2017年5月19日】
●
株式会社ネクスティエレクトロニクスと、
たけおかラボ株式会社との共同特許
※たけおかラボ(株)は、(株)アックスの子会社
取得済み特許:今後の基本ソフトウェアの重要な部分
8bit時代 MP/M 8080 (1979年)
● MP/M (CP/Mのマルチユーザ版)
– 8080 CPU
● Z80の先祖。Z80は、8080のバイナリ上位互換
● クロック:2MHz
– マルチユーザ/マルチタスク
● 最小 32KB メモリで動作
– バンク切り替えが通常の時代
● 「バンク切り替え」一般人には、PC9801(8086,V30)で1MBを超えるときに、有名になる
● MP/Mは、メモリの下位32KB〜48KBを、切り替えて使用
– 上位に、OSが居た
– MMUがあれば、使用できた
● マッピング(アドレス変換)
– アクセス管理、不在ページ管理など無い
● バンク切り替え/ページ・テーブル操作部分は、抽象化、分離されていた
– XIOS部分を、ハードウェアに合わせて、コーディング
– 1MBぐらいの実メモリを扱える
● 8080,Z80の論理空間は64KB
4
OS常駐 使えない 使えない
バンク切り替え・メモリ模式図
●
物理メモリの上位アドレスは、バンク・レジスタで与える
●
(主に80系の場合)上位アドレスには、OSが常駐する
●
物理メモリの一部は、使えないことが多い
– OS常駐部と重なる部分が、無駄になるハードウェアが一般的
論理空間
バンク#0
0番地
上位アドレス
バンク#1 バンク#2
OS常駐
バンク・
レジスタ
5
バンク切り替え・メモリ模式図
バンク#0
0番地
上位アドレス
OS常駐
バンク・
レジスタ
OS常駐
使えない
バンク#1
使えない
バンク#2
6
昔のハードウェア バンク切り替え(1)
●
TLBなんか無い
●
物理アドレス上位は、バンク・レジスタで拡張
●
64KB 論理空間の上位8〜16KBぐらいは、バンク切り替えが効かないようにする
– 論理空間の最上位アドレスには、OS(CP/Mとか)が常駐
– リセット時には、ROMが出てくるようにも、しなければならない
バンク・
レジスタ
CPU
メイン・
メモリ
バンク設定
Z80系は、
I/O命令
下位アドレス
13bit
変換テーブルが一つの場合
データ・バス
物理メモリ
上位アドレス
上位アドレス
3bit
最上位8KB検出
(3bitのAND==1 Then bank=0)
7
マッパ・メモリ管理模式図
●
プロセスは論理アドレス空間で動作
●
実メモリと、プロセス空間のメモリ・アドレスは異なる
●
メモリ保護がある
●
基本的に、他のプロセスのメモリは、触れない
●
プロセス空間に、物理ページを貼り付けてアクセス可能にすることを、「マップする」という
プロセス B
機械の実メモリマップ プロセスの仮想空間
プロセス A
プロセスの仮想空間
実メモリがマップされる
ページ単位で
通常はOSが暗黙に行う
実メモリがマップされる
ページ単位で
通常はOSが暗黙に行う
8
昔のハードウェア mapper(1)
●
TLBなんか無い(TLBミスのペナルティは無い \(^^)/)
●
全アドレスを、テーブルで持つ
●
高速SRAMにテーブルを入れる
●
テーブルをセットするのは、ちょっとした工夫が要る
– セットしたいテーブルのアドレスを、上位アドレスに出し、データ線から書き込み
高速
SRAM
CPU
メイン・
メモリ
アドレス
読み出しデータ
上位アドレス
4bit(PDP-11,
Z80, 6809)
12bit(680x0)
下位アドレス
12bit (4KB/ページ)
変換テーブルが一つの場合
データ・バス
書き込みデータ
上位アドレス
本数、多め。
8bitで、1MB
物理メモリ
9
TLBインコヒーレンシ、なにそれ?!
●
TLBなんか無い
●
昔は良かった
– 2CPUぐらいなら、あり得た
– CPU内キャッシュが無い時代だった。メイン・メモリも超遅かった
高速
SRAM
CPU
メイン・
メモリ
DRAM
アドレス
読み出しデータ
上位アドレス
4bit(PDP-11,
Z80, 6809)
12bit(680x0)
変換テーブルが一つの場合
上位アドレス
本数、多め。
8bitで、1MB
物理メモリ
CPU
CPU
10
昔のハードウェア mapper (2)
●
全アドレスを、テーブルで持つ
●
高速SRAMにテーブルを入れる
●
コンテキスト(プロセス)を、複数持てる
●
コンテキストが複数 無いと、プロセス・スイッチの度に、全テーブルの入れ替えが
発生
高速
SRAM
CPU
メイン・
メモリ
アドレス
読み出しデータ
上位アドレス
4bit(PDP-11,
Z80, 6809)
12bit(680x0)
下位アドレス
12bit (4KB/ページ)
複数コンテキストの、変換テーブルがある場合
データ・バス
書き込みデータ
上位アドレス
本数、多め。
8bitで、1MB
物理メモリ
コンテキスト・
レジスタ
6829MMU 8bit時代 (1980年ごろ)
● 6829(67476)は、6809専用MMU
– アドレス変換のマッパ。64KB論理空間を、2MBの物理メモリにマップ
● 16bit アドレス→21bit アドレス
– 2KB/ページ(下位11bit)
– コンテキスト(“TASK”)は、4つ
● 6829を増設すると、増やせる
– システム/ユーザの管理(プロテクション)はある
– DMAは、Task#1 を使用
● システム・モード/ユーザ・モードがある
– 6809CPUには、そういう概念は無い。 MMUがサポート
– システム・モードでは、MMU操作ができる
● ユーザ・モードは、MMUに触れない
– 見えないページは、絶対に見れない
● CPUが外部割り込みを受けるか、ソフトウェア割り込み(SWI, (INT))を実行すると
6829は、システム・モードになる
– CPUが出力しているステータス信号を、見ていると,割り込み応答 実行が判る
●
システム・モードから、ユーザ・モードへの移行
– CPUが、6829のヒューズ・レジスタに値を書き込む
●
何クロック後に、ユーザ・モードになるか
●
プロセス再開の定石ルーチンの実行クロック数は、決まっている
– キャッシュとか無いので、いつも同じクロック数
– その後、ぴったりのクロック後に、ユーザ・プロセスの再開を行う
@houmei さんのつぶやきより
6829MMU 8bit時代 (1980年ごろ)
●
システム・モードから、ユーザ・モードへの移行
– CPUが、6829のヒューズ・レジスタに値を書き込む
●
何クロック後に、ユーザ・モードになるか
●
プロセス再開の定石ルーチンの実行クロック数は、決まっている
– キャッシュとか無いので、いつも同じクロック数
– その後、ぴったりのクロック後に、ユーザ・プロセスの再開を行う
1サイクル
FUSEレジスタに
セット
ユーザ空間の
スタックから、
情報をレジスタに
復帰
Return from Interrupt
ユーザ空間に切り替わる
Motorola MC6829 advanced informationより
http://matthieu.benoit.free.fr/cross/data_sheets/mc6829.pdf
8bit時代 OS/9 6809 (1982年ごろ)
● OS/9 6809 Level 1
– MMU無し版, 64KB で動作
– マルチタスクOS
● プログラム・ローダを手抜きしていたので、PIC(位置独立コード)しか許されな
かった
– すべての変数は、indexレジスタ相対
– 6809は、ポインタ・レジスタが4本もあった(8bit機としては、すごく多い)
– プログラム中の定数は、PC(プログラム・カウンタ)相対で参照
●
実行バイナリを、外部記憶から読むことを嫌がり
メモリをスキャンして、
ヘッダを見つけたら、終わりまでのCRCを計算し、
CRCが合致したら、そのバイナリが正常であるとして、実行を開始した (^^;
– ROMも、スキャン対象。ROM組込みのコマンド・バイナリも発見された
● OS/9 68000 は、フツーになってしまい、特に面白くはない(残念)
8bit時代 OS/9 6809 (1980年ごろ)
● OS/9 6809 Level2
– MMUあり版
– 2MBまでの物理メモリをサポート
– Gimix というハードウェアが、OS/9 6809 Level2のリファレンス・
ハードウェア
●
割と手抜き
● 当時は、高速SRAMで、アドレス変換機構を作っても、十分、高速に動作した
– 日立のBASIC Master S-1が、また、
独自のマッパ
●
このマッパは、まっとう
● モトローラ純正MMU 6829
– Gimixとは、まったく異なる
PDP/11のMMU(1)
● PDP/11 のMMUは、マッパ
– アドレス変換
– 不在ページ/書き込み禁止の検出はできる
● だが、フォールトからの回復&再開はできない
– 例えば、write命令は、フォールトを起こしても、終了してしまう
● 64KBの論理空間を、8つのセグメントに分割
●
各セグメントの論理アドレスは、物理メモリ・アドレスにマップ
● 各セグメント長は、0〜8KBytesまで可変 (64Bytes単位で)
● セグメントは、ベース・アドレスから、Up/Down方向に伸ばせる
– Downは、スタックの伸長に
● PDP-11/40, PDP-11/45 などは、248 KB物理メモリ(12 bit長)に変換
● PDP-11/70, PDP-11/44, PDP-11/23などは、4MB物理メモリ(16 bit
長)に変換
– 64Byte(6bit長)が単位
http://gunkies.org/wiki/PDP-11_Memory_Management
PDP/11のMMU(2)
● UNIX Ver.7は、マッパを使用
– デマンド・ページングとかやらない
● RSX/11M (PDP/11 のネイティブOS)
– オーバレイによるプログラム・コードの入れ替え
●
プログラムを、複数のセグメントで構成
●
リンク時に、セグメントを指定
●
サブルーチン・コール時に、適切なセグメントを入れ替え
– 不適切なセグメントの依存関係は、リンクがエラーになる
8bit時代 (1983年)
● CP/M 3
– シングル・ユーザ、シングル・タスク
– メモリマッパなどがあれば使えた
– HD64180 (日立のニセZ80、後のZ180) のメモリマッパが、
CP/M 3用
18
64180・メモリ管理模式図
●
論理空間が、3領域に分割 & アドレス変換
– 低位メモリ
– コモン・エリア(最上位=OS常駐部)
– バンク・エリア(中央部)
●
CP/M Plusに最適
バンク・
エリア
コモン・エリア
論理アドレス 物理メモリ
低位メモリ
OS常駐部
バンク#1
バンクの
低位リミット
レジスタ
コモン・エリアの
低位リミット
レジスタ
コモン・ベース・
レジスタ
バンク・ベース・
レジスタ
低位メモリ
バンク#2
19
64180・メモリ管理機構
●
コンパレータ(比較器),adder(加算器)がある。
●
日立が好きな感じ(私の主観的 感想)
Hitachi HD6180 Family より
http://www.farnell.com/datasheets/99468.pdf
16bit時代 Z8001用 MMU (1982年ごろ)
●
Z8010:Z8001用MMU
●
マッパであった
– セグメント単位のアドレス変換
– セグメントは、物理的に連続した領域
– セグメントのサイズ・チェックは行う
●
アクセス管理はあった
●
ユーザ/システム
●
Z8001は、フォールトからの回復はできなかった
– Z8003で可能に
MMU
CPU
メイン・
メモリ
アドレス/コマンド
実アドレス
最上位アドレス
(セグメント番号)
7bit
アドレス・データ・バス下位8bit
アドレス・データ・バス上位8bit
上位アド
レス
16bit
SUN2(1983年),SUN3(1985年)
● 68010, 68020 に、外付け
– 高速SRAMで、変換テーブル
– コンテキストは、4つ (SUN3/160?)
– SUN2もコンテキストは複数
●
MMUへのコマンドはアドレスに載せた
– マッパ中のテーブルへのアドレス設定コマンドなど
– 変なアドレスからの読み込みが、テーブルへのセット・コマンドだったり
高速
SRAM
CPU
メイン・
メモリ
アドレス
読み出しデータ
上位アドレス
12bit
下位アドレス
12bit (4KB/ページ)
複数コンテキストの、変換テーブルがある場合
データ・バス
書き込みデータ
上位アドレス
本数、多め。
だが、実メモリ
16MBのモデ
ルは希少
コンテキスト・
レジスタ
?繋がっていないと思われ…
2bit程度〜
SONY News (1987年)
● 68020 に、外付け
– 高速SRAMで、変換テーブル
– Newsの最初のデスクトップ・モデルの
コンテキストは、1つ
(だったはず OS用コンテキストがあったかも)
– プロセス・スイッチのたびに、MMUテーブル入れ替えが発生
● SUN3の同じクロック周波数のモデルと比べて、もっさり動作した
68030(1987年)
● オンチップMMU内蔵
● TLB方式
– CPUコア内のマイクロコードによる、ハード・ウォーク
– 初代Sparc(1987), PowerPC601(1992)は、ハード・ウォーク
● PPC603は、ソフト・ウォーク
〜現在に至る…
● X86, ARMは、伝統のハード・ウォーク
●
他のアーキテクチャは、ソフトウェアによるページ・テーブル・
ウォークが多い

大昔のMMU