2004-03-18 04:26:52 +0900 (1720d); rev 2
Alpha の仮想メモリ空間の構造と操作方法について。 仮想アドレスの管理方法は特定の PalCode に全面的に依存するので、 ここでは Digital UNIX PALcode のみを仮定する。
参照: AlphaArchitectureReferenceManual II-B DIGITAL UNIX Software
Alpha では常に仮想アドレスが有効である。 後に述べるページテーブルはハードウェア (ファームウェア?) によって初期化される。
仮想メモリ空間はアドレスの範囲によって大きく三つに分割される。
kseg は OS カーネル用のメモリ領域である。 物理アドレス上でも仮想アドレス上でも位置は固定されており、 ユーザプロセスからはアクセスできない。
残りの seg0 と seg1 はページに分割して管理される。 ページサイズはハードウェアの実装により 8KB, 16KB, 32KB, 64KB のいずれか。
ページは深さ 3 または 4 のツリー構造で管理される。 ツリーのノードは 64 ビットの PTE (Page Table Entry) である。
PTE に記録される属性のうち主なものを以下に示す。 括弧内はフィールドのビット幅。
仮想アドレスを物理アドレスに変換するには以下のようなアルゴリズムが使われる。 C 風の言語で以下のコーディングスタイルを使って記述した。
void*
physical_address(void *va)
{
struct PTE *pte0, *pte1, *pte2;
switch (PAGE_TABLE_DEPTH) {
case 4:
pte0 = (PTBR * PAGE_SIZE) | (level0_index(va) * 8);
pte1 = (pte0->PFN * PAGE_SIZE) | (level1_index(va) * 8);
break;
case 3:
pte1 = (PTBR * PAGE_SIZE) | (level1_index(va) * 8);
break;
}
pte2 = (pte1->PFN * PAGE_SIZE) | (level2_index(va) * 8);
return (pte2->PFN * PAGE_SIZE) | (level3_index(va) * 8);
}
※ PTBR (Page Table Base Register) は特殊レジスタ
当然だが、この操作は CPU が実装するものであり、 OS がやるのではない。
上記の仮想→物理アドレスの変換はそれなりにコストがかかるので、 変換結果をハードウェアがキャッシュするのを認めている。 そのキャッシュを translation buffer と呼ぶ。
しかし仮想メモリ空間はプロセスごとに独立なのでキャッシュは共有できない。 従ってハードウェアがプロセスの変更を知る必要がある。 これを示すのが内部レジスタの ASN (Address Space Number)、 および PTE の ASM (Address Space Match) フィールドである。
Related Pages: AlphaArchitecture AlphaProcessStructure AlphaHardwareIo
system revision 1.162