見出し画像

6829 - 6809用MMU

仮想メモリの話を以下に書きましたが、いきなり80286の仕組みを解説するには少々ハードルが高そうなので、よりシンプルな6809向けMMUである6829を紐解いて見ようと思います。

プロテクトモード - 仮想アドレスとメモリ保護

6829は6809から出力されるアドレス線のA10~A0の11ビットはそのままメモリと接続し、A15~A11の5ビットをタスクごとに割り当てられたマッピングRAMに書かれたテーブルを引いてA20~A11の10ビットを生成することにより都合2Mのメモリ空間を扱えるようにします。

メモリ管理ユニット

結局のところCPUから見えるアドレスは16ビット分なので、このテーブルを使ってタスクごとにアクセスできる64K分の物理アドレスを決めるわけです。タスクはMMU1つあたり4つまで持つことが出来、最大でMMUを8つ使い32個のタスクを扱えるようになっています。このうちタスク0はOSが使うことが決められており、リセット後はタスク0が走るようになっています。またタスク1はDMAタスクという特殊な役割を与えられておりDMAコントローラから見えるアドレスを管理しています。そうするとMMUひとつでは2つのユーザタスクしか使えませんが、フォアグラウンドひとつ、バックグラウンドひとつでも充分なほどの時代でした。

大昔のMMU

MMUが使用する物理アドレスはCPUの割り込みアドレスのすぐ下のメモリの最上位アドレス付近が使われるようになっていて、リセット時にはタスク0が選ばれ、このメモリをアクセスできるようになるので、ここで必要な設定をしてユーザタスクへの切り替えを行うという流れです。ここに置かれるMMUのレジスタとして使われるメモリには8つまで許されるMMUの選択関係($40~$47)とタスクごとの論理アドレスから物理アドレスへの変換で用いるテーブル($00~$3F)が置かれます。

番外編その3:6809用MMU(Memory Management Unit)考察(by はせりん)

面白いのは$49にあるヒューズレジスタで、タスクの切り替えの際に、どのタイミングでタスクを切り替えて新しいメモリ空間に移行するかの指示をします。例えば新しいタスクに移る際にJMP命令を実行するとして、JMP命令の飛び先アドレスをしっかりと現在のタスクで取り込んでから、この瞬間にタスクを切り替えないとなりません。ですからJMP命令の実行にかかるマシンサイクル数を、このレジスタに書き込んでおくとMMUがカウントダウンを始め0になった瞬間にタスクが切り替わるように動作するのです。

LDA #4
STA FUSEREG
JMP NEWTASK

STAで書かれたヒューズレジスタの値はJMP命令実行中にマシンサイクルごとにカウントダウンされ、JMP命令の読み込みが終わった瞬間に0になってタスクが切り替わる

JMP命令の実行には4サイクルかかるので、現在のタスクのメモリ空間にあるJMP命令のオペランドであるNEWTASKを読み込み終わった瞬間にタスクが切り替わり新しいタスクのNEWTASKから実行が継続されるわけです。6809には命令キューやキャッシュが無いので、これでも簡単なのですがメモリ空間の切り替えの瞬間というのは、なかなか気が抜けません。

6829は言ってみればバンクメモリ切り替えチップに過ぎず、メモリ保護の機能は持っていないのですが、物理アドレスの最上位ビットをCPUのR/W信号とORすることによりメモリを読み出し専用として扱う例が載っています(搭載できるメモリが半分になってしまいますが、それでも1Mは使えます)。タスクの中で読み出し専用にしたい論理アドレスを物理アドレスの上半分に割り当てれば良いわけですね。

またリセット時に走るタスク0がシステム管理に使うメモリ空間をユーザタスクからアクセスできなくすれば、MMUの操作はできなくなるので、特権命令といった特別な命令を用意する必要もありません。

6829

http://www.bitsavers.org/components/motorola/_dataSheets/6829.pdf

MC6829 Memory Management Unit (Motorola)

https://colorcomputerarchive.com/repo/Documents/Datasheets/MC6829%20Memory%20Management%20Unit%20(Motorola).pdf

Memory Management Techniques Using the MC6829

http://www.bitsavers.org/components/motorola/_appNotes/AN-0859_Memory_Mangagement_Techniques_Using_The_MC6829.pdf

こうしてあまり複雑な機能をチップに詰め込めなかった時代であるにも関わらず、比較的シンプルな方法でメモリ空間を拡張し、OSのメモリをユーザプログラムから保護する手段を提供できるようにしていました。何せこの時代、プログラムが暴走してしまったらリセットするしか無いので(そしてOSのメモリも破壊されるとリブートしか選択肢がない)、いわゆる本物のOSを走らせることが出来て、暴走したプログラムからも復帰できるというのは、マイコンであっても信頼性が必要な用途にも使えるようになったものだと思ったものです。もっとも、これが活用された例はまだまだ少なかったのですけど。

参考文献:6809ハンドブック(アスキー出版)

ヘッダ画像は、以下のものを使わせていただきました。
https://commons.wikimedia.org/wiki/File:MMU_principle_updated.png
Mdjango, Andrew S. Tanenbaum - 投稿者自身による著作物, CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=20478405による

#MMU #MC6809 #MC6829 #OS9 #メモリ管理ユニット #タスク #バンク切り替え #物理アドレス #論理アドレス #メモリ保護

この記事が気に入ったらサポートをしてみませんか?