メモリ管理機構

Lions本だけでは不十分なので、handbookから情報を拾い集めて補足しておく。

Page Description Register(PDR)

Lions本2.9の補足である。以下はPDP-11/40についての記述に従う。 PDP-11/45、PDP-11/70では他のbitも意味をもつことがあるが、 そのてのbitには0を指定しておけばPDP-11/40と互換の動作になる。

bitは次のように並んでいる。
bit名前略称
1,2Access Control FieldACF
3Expansion DirectionED
6Written IntoW
8〜14Page Length FieldPLF
それぞれの意味は以下のとおり。

ACF
00割り当てなし
01read only
10(未使用)
11read write
ED
0ページの最小アドレスから割り当て
1ページの最大アドレスから割り当て
W
0書き込みなし
1書き込みあり
PAR/PDRを設定すると0にクリアされる。書き込みがあると1にセットされる。 クリア/セットは自動的に行われる。いわゆるdirty bitである。
PLF
0から127までの値をとる。 実際にページに割り当てられるブロック数はPLFの値+1である。 ブロックは64byteなので、ページには最大8kbyteのメモリーを割り当てることができる。

SSR1

PDP-11/40のアドレス管理機構にはないレジスター。 汎用レジスターの自動加減値を記録している。 命令の最初にクリア、自動加減が行われるとその内容が記録される。
bit説明
0〜2レジスター番号
3〜7bit0〜2で指定したレジスターの変化値
8〜10レジスター番号
11〜15bit8〜10で指定したレジスターの変化値
命令の実行中にアクセスした番地にメモリーが割り当てられていない場合、 トラップが発生する。実行を再開するには といった操作が必要だが、SSR1では後者に必要な情報を提供する。

m40.sのbackupがおこなっているように、 SSR1がなくてもある程度の推理は可能である。 が、trap.cで指摘されているようにかならずしもうまくいくとはかぎらない。

PDP-11/45ではStatus Register 1(SR1)、 PDP-11/70のprocessor handbookではMemory Management Register1(MMR1)など、 名前はまちまちである。ここではUNIXでの名前に統一してある。

SSR3

PDP-11/40のアドレス管理機構にはないレジスター。 PDP-11/40では命令とデータは空間を共有するが、 PDP-11/45やPDP-11/70では別の空間を割り当てることができる。 Lions本2.12参照。

bit説明
0USER separation enable/disable
1SUPERVISOR separation enable/disable
2KERNEL separation enable/disable
4ENABLE 22-BIT MAPPING/ENABLE 18-BIT MAPPING
5ENABLE UNIBUS MAP/DISABLE UNIBUS MAP
UNIXではSUPERVISORモード(PDP-11/40にはない)は使わない。 bit4,5はPDP-11/70のみである。

補足

PDP-11の「仮想記憶」は、VAX以降の現代的な仮想記憶とはずいぶん様子がことなる。 そもそも、仮想メモリ空間のほうが実メモリ空間より狭い。 8086のセグメントもこれに近い。 実際、UNIX第6版のカーネルを8086に移植した人は、 「仮想記憶まわりが似てるのでらくちんだった」と述べている。

PDP-11の仮想記憶では、でかいプログラムを小さなメモリ空間で使う、 ということは不可能である。 どうしてもやりたければ、 プログラムを分割して必要な部分をメモリ上に読み込んで実行する、 というオーバーロードの技術を利用することになる。

UNIX第6版ではオーバーロードは採用されていないが、 その後の2BSDシリーズではこってりと使われており、 「どうしてこれがPDP-11で動くんだ?」というような魔法を下支えしている。 16bitの桎梏のもたらした徒花と言えよう。


戻る