2018-12-02 20:17 — asano
カテゴリー:
MAA-1の改造のデバッグ状況は逐一実況してもなんなので大きな進展があったときに書くことにしますね。
今回はパーソナルなコンピュータのメモリ事情 (第8回: 80386以降)で書くと予告してまだ書いていなかったMC68000系のメモリ事情について取り上げてみようと思います。
以前書いたようにIntelは8086で64kBから1MBにメモリ空間を拡張するに際してはアドレスのレジスタ長を8ビット時代の16ビットのままセグメントによって拡張する道を選びました。単独で64kBを超えるメモリを必要とするプログラムが少ないという当時の事情を考慮すれば悪くない選択だったのでしょう。不幸は拡張を繰り返して使われ続けたことです。
一方でMotorolaは大胆にレジスタ長をデータもアドレスも32ビットにするという選択をしました。Intelが必要に応じて少しずつ拡張していくことになったのに対し、最初に考えうる最大限を計画しておいてそのサブセットを実装していくという道です。
最初のMC68000はデータバスは16ビット・アドレスバスは24ビットとして誕生しました。パッケージを考えるといたずらにピン数を増やすわけにはいきませんし、16MBを超えるメモリも現実的ではなかったからです。
ソフトウェア的には内部のレジスタは32ビットあるのでプログラムからは4GBの空間が見えています。16MB以上のアドレスにはイメージが見えていて今は使えませんが、将来アドレスバスのビット数が増えたプロセッサが登場したらそのまま移行できるわけです。
16MBが足りなくなる前に上位のプロセッサが登場していますし、上記のような特殊な例を除いてメモリ空間の増加は単にアドレスの有効ビットが増えるだけです。メモリ空間を拡大するための姑息なテクニックというのはあまり使われなかったと思います。
8086のMS-DOSのようなユーザプログラムがハードウェアを叩くような汎用システムがあまり普及しなかったという面もあります。
アドレスとは別にFunction Codeというものも出力されています。これは3ビットあってMC68000では以下の5つが定義されていました。
FC2 | FC1 | FC0 | Cycle Type | 備考 |
---|---|---|---|---|
0 | 0 | 1 | User Data | |
0 | 1 | 0 | User Program | |
1 | 0 | 1 | Supervisor Data | |
1 | 1 | 0 | Supervisor Program | |
1 | 1 | 1 | Interrupt Acknowledge | 割り込み応答であり、メモリ空間ではない |
これをアドレスデコードに加えることによって16MBを超えるメモリを実装することも可能ですが、メモリ空間が4つ区別できるからといって16MB×4 = 64MBなどというシステムを作ると困ったことになります。
Supervisor Modeで動作しているOSがユーザプログラムをディスクからメモリにロードしようとしてもSupervisor Dataの空間にしか書けないので、Supervisor ModeからUser Program/Data空間にアクセスするための仕組みを用意してやらないといけません。
前述のようにこのようなことが必要になる前にメモリ空間の広いものが出てきましたからこの手法はあまり使われなかったと思われます。
Function Codeの本来の用途はメモリ空間の拡大ではなくメモリの保護です。アドレス範囲を決めてUser Modeからのアクセスを禁止したりすることが可能なMMU(Memory Management Unit)MC68451も用意されていました。アクセス違反を検知してバスエラーを通知したりメモリの並べ替えができます。
メモリ未実装アドレスへのアクセスでバスエラーを発生させ、メモリを適切に並べ替えてからアクセスを再開できれば仮想記憶が実現できるのですが、「再開」については次のMC68010を待たなくてはなりません。
コメントを追加