はじめて読む486　第9章 ページング

## 9. ページング

## 9.1 ページングとは

- セグメント方式はメモリを任意の大きさに区分けする方法
- ページング方式では、ページ単位でアドレス変換を行う（論理メモリ空間におけるページと物理メモリ空間におけるページを対応付ける）
- デマンドページング
    - アクセスの局所性を考慮すると、その時点で必要な論理ページだけを物理ページに対応づけておけば、プログラムの実行が可能
    - 物理ページに対応づけていない論理ページが必要になったら、その時点で初めて物理ページに対応づければ良い
- 仮想記憶
    - デマンドページングを拡張することで、仮想記憶を実現することができる
        1. プログラムが次の区間に進み、物理メモリに対応付けられていない論理ページAをアクセスしたとする
        2. 486はページフォルトを発生させる（プログラム実行は一時中断し、オペレーティングシステムに制御が移る）
        3. ページフォルトハンドラにより、物理メモリを割り当てられている論理ページの中であまり使われていない論理ページBを探す
        4. 論理ページBに対応する物理ページPの内容をディスク装置に保存する（ページアウト）
        5. 論理ページBと物理ページPの対応を解除する
        6. 物理ページPを論理ページAと対応させる
        7. 論理ページAの内容をディスク装置から物理ページPに読み込む（ページイン）
    - 仮想記憶を使うことで実際に搭載されている物理メモリよりも大きな論理アドレス空間を実現できる
        - メモリが2Mバイトしか搭載されてないとしても、ディスク装置に10Mバイトのスワップのための領域があれば、10Mバイトのメモリ空間を必要とするプログラムを実行できる
- セグメント方式は、メモリ保護やタスク間のメモリ空間の分離に適している（属性や物理メモリとの対応を大きな区画単位で設定できる）
- ページング方式は、メモリアクセスの局所性を利用して、効率的に物理メモリを割り当てたり、仮想記憶を実現するのに適している
- 386以降のCPUではセグメント方式に加えてページング方式を組み込んだ2段階のメモリ管理機構を実現した
    - 物理アドレス空間はページング方式によって固定長のページ単位に分割して管理
    - リニアアドレス空間のメモリをセグメント方式によって任意の大きさに分割する
        - ページング方式によって物理メモリ空間に対応付ける論理メモリ空間のことを、リニアアドレス空間という
    - セグメントとページングは独立した機能として働くので、ページ境界とは無関係にセグメントに分割することができる

## 9.2 ページングのしくみ

- セグメント機構
    - セグメントアドレスとオフセットアドレスの組をリニアアドレスに変換
- ページング機構
    - リニアアドレスを物理アドレスに変換
    - ON/OFFの機能がある
        - システム起動時はOFF
        - CPU内のレジスタであるCR0のPGビットをONにするとONになる
        - OFFの場合はそのままリニアアドレスが物理アドレスとして出力される
- 物理アドレスに変換後、キャッシュメモリがアクセスされ、ヒットしなかった場合や書き込みアクセスの場合には、物理アドレスがCPU外部のアドレスバスに出力される
- ページング機構では、32ビットのリニアアドレスを上位20ビットのページ番号と下位12ビットのページ内オフセットの2つに分解する
    - ページ内オフセットは変換せず、そのまま物理アドレスの下位12ビットとする
    - ページ番号はページテーブル（論理番号と物理ページ番号の対応表）を使って物理ページ番号に変換する
- ページテーブルの大きさに対処するため、486ではページ番号を2つに分解している
- ページング機構の詳しい仕組み
    1. CPU内のCR3（コントロールレジスタ3）の内容を取り出す
        - CR3は、CPUにページディレクトリテーブルの物理アドレスを指示するための専用レジスタ
    2. リニアアドレスを3つに分解する
        - ページディレクトリテーブル内のインデックス
        - ページテーブル内のインデックス
        - ページ内のオフセット
    3. ページディレクトリテーブルのインデックスを参照し、PTE（ページテーブルエントリ）からページテーブルのページ番号を取り出す
    4. ページテーブルのインデックスを参照し、PTEから物理ページのページ番号を取り出す
    5. ページの先頭アドレスにオフセットを加えて最終的な物理アドレスを取得する
- ページテーブルも通常のメモリと同様にページとして扱うことで仮想化の対象にできる
    - 最近アクセスのあった論理ページのPTEを含むページテーブルを論理ページとして物理ページに対応付け、それ以外を物理テーブルに対応付けていない論理ページとする
    - 物理ページに対応付けられていない論理ページにアクセスするとページ フォールトが発生する（プログラムが本来アクセスした論理ページに対してでなく、ページテーブルに対して発生する）
    - 論理ページと同様の手順でページテーブルを物理ページに対応付ける
- PTE（Page Table Entry）の構造

| ページ番号 | このエントリに対応するページのページ番号。下位12ビットの0を補うと、ページ先頭のアドレスになる |
| --- | --- |
| OS用 | CPUは使用しない。オペレーティングシステムがメモリ管理用に利用できる。 |
| インテル予約 | インテルが将来開発するプロセッサのために予約されている。 |
| D | Dirtyビット、このエントリに対応する書き込みが行われるとCPUが1にセットする。 |
| A | Accessビット、このエントリに対応するアクセスが発生するとCPUが1にセットする。 |
| PCD | ページキャッシュディスエーブルビット、0にセットすると、対応するページのキャッシングやキャッシュライトスルーを禁止する（486のみ） |
| PWT | ページライトスルービット、0にセットすると、外部キャッシュをライトスルーにし、1ならばライトバックにする（486のみ） |
| U/S | ユーザースーパーバイザービット、0ならば特権レベル3ではアクセスできない。 |
| R/W | リードライトビット、0ならば特権レベル3で書き込みできない。CR0レジスタのWPビットが1の時、特権レベル2以下でも書き込みできない。 |
| P | Presentビット、1ならば、ページがメモリ上に存在することを示す。0ならばページフォルトを発生させる。 |
- TLB（Translation Lookaside Buffer）
    - PTE専用のキャッシュメモリ
    - ページング機構によるアドレス変換の最中にPTEが読み込まれると、その内容がCPU内のTLBにコピーされる
    - 486では、TLBには32個のPTEが格納できるようになっており、TLBがいっぱいになった時には、自動的にあまり使われていないPTEが捨てられ、そこに新しいPTEが格納される

## 9.3 ページングのプログラミング

- 仮想記憶をサポートするプログラム
    - 初期設定部
        - ページディレクトリテーブルの設定
        - ページテーブルの設定
        - CR3にページディレクトリテーブルのアドレスを設定
        - IDTにページフォルトハンドラを登録
        - CR0のPGビットを1にセットしてページングをONにする
    - ページフォルトハンドラ
        - あまり使われていない論理ページを選択
        - ページアウト
        - ページアウトした論理ページの物理ページとの対応を解除（PTEのPビットを0にリセット）
        - ページフォルトの発生したページに物理ページを対応させる（PTEのページ番号を設定、Pビットを1にセット）
        - TBLをフラッシュ
        - ページイン
- メモリ上のPTEの内容を変更した場合は、PTEとTLBの内容が食い違うため、TLBを無効にする、これをTLBのフラッシュという
- 486は、ページディレクトリの先頭アドレスを格納するレジスタCR3の内容を変更すると、自動的にTLBフラッシュを行うようになっている