AlphaVirtualMemorySpace

2004-03-18 04:26:52 +0900 (1632d); rev 2

Alpha の仮想メモリ空間の構造と操作方法について。 仮想アドレスの管理方法は特定の PalCode に全面的に依存するので、 ここでは Digital UNIX PALcode のみを仮定する。

参照: AlphaArchitectureReferenceManual II-B DIGITAL UNIX Software

基本事項

Alpha では常に仮想アドレスが有効である。 後に述べるページテーブルはハードウェア (ファームウェア?) によって初期化される。

メモリセグメント

仮想メモリ空間はアドレスの範囲によって大きく三つに分割される。

kseg

kseg は OS カーネル用のメモリ領域である。 物理アドレス上でも仮想アドレス上でも位置は固定されており、 ユーザプロセスからはアクセスできない。

ページ

残りの seg0 と seg1 はページに分割して管理される。 ページサイズはハードウェアの実装により 8KB, 16KB, 32KB, 64KB のいずれか。

ページテーブル

ページは深さ 3 または 4 のツリー構造で管理される。 ツリーのノードは 64 ビットの PTE (Page Table Entry) である。

PTE

PTE に記録される属性のうち主なものを以下に示す。 括弧内はフィールドのビット幅。

PFN, Page Frame Number (32)
ページのアドレスを示す。 V フィールドが真のときのみ有効。
V, Valid (1)
PFN フィールドが有効であるかどうかを示す。 このフィールドが偽の場合、PFN の値の意味は OS 依存になる。
GH, Granularity Hint (2)
非ゼロのときは translation buffer の処理を高速化するためのヒントを指定する。
ASM, Address Space Match (1)
? FIXME
UWE, User Write Enable (1)
ユーザモードから書き込めるとき真。
URE, User Read Enable (1)
ユーザモードから読み込めるとき真。
KWE, Kernel Write Enable (1)
カーネルモードから書き込めるとき真。
KRE, Kernel Read Enable (1)
カーネルモードから読み込めるとき真。
FOE, Fault On Execute (1)
実行禁止のとき真。 実行禁止とは、このページ内の値を I-stream として扱えないことを指す。
FOW, Fault On Write (1)
書き込んだときに Fault on Write 例外を発生する。
FOR, Fault On Read (1)
読み込んだときに Fault on Read 例外を発生する。

物理アドレス生成

仮想アドレスを物理アドレスに変換するには以下のようなアルゴリズムが使われる。 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

上記の仮想→物理アドレスの変換はそれなりにコストがかかるので、 変換結果をハードウェアがキャッシュするのを認めている。 そのキャッシュを translation buffer と呼ぶ。

しかし仮想メモリ空間はプロセスごとに独立なのでキャッシュは共有できない。 従ってハードウェアがプロセスの変更を知る必要がある。 これを示すのが内部レジスタの ASN (Address Space Number)、 および PTE の ASM (Address Space Match) フィールドである。


system revision 1.162