Yabu.log

ITなどの雑記

ページングについて

ページングについて

ページングとは

  • ページングとは固定長にメモリを分割して管理する方法
    • 以下をページと呼ばれる単位に対して行う
      • メモリの割り当て
      • アドレス変換
  • セグメントとの違い
    • セグメントは可変長
    • ページングは固定長

アドレス参照方法

  • 32bitのアドレスを分割する
    • 上位20bitを論理ページとする
    • 下位12bitをページオフセットとする
  • 論理ページと物理ページを対応付けるページテーブルで物理ページのベースアドレスを得る
  • 486ではページテーブルが2段になっている。
    • そのまま20bitのページテーブルを作るとサイズが大きくなりすぎる
    • ページテーブルのエントリ(PTE) 4Byte * 論理アドレス総数 220 = 4,194,304 = 4MBも必要になる*1
    • 論理ページを半分に分けて、210件数分のページテーブル(1KB)を2段で構成する(最小2KB)
    • 上位10bitに対応したページテーブルをページディレクトリテーブルという。
      • 下位10bitに対応したページテーブルはページテーブルという呼称のまま。

PTE(Page Table Entory)

主要なものだけをピックアップ。ライトスルー、ライトバックのオプションに関するものや権限に関するものは省略している。

位置 役割 意味
12~31bit 物理ページ番号 物理ページ番号を表す。
6bit目 Dビット Dirty bit。write時に1。ページアウト時にディスク書き込みの必要有無の判断に利用
5bit目 Aビット Access bit。アクセス時に1。アクセス頻度からページアウトの判断に利用
0bit目 Pビット 1ならばページが存在している。0ならばアクセス時にページフォルトを発生させる
  • PTEはもちろんキャッシュされる。このキャッシュメモリをTLB(Translation Lookaside Buffer)という

仮想記憶

  • ページング=仮想記憶ではない。
  • ページング方式は仮想記憶に利用される方法の1つに過ぎない。*2
  • デマンドページング
    • 必要になったページがメモリ上に存在しない時に適当に不要そうなページをスワップする方法
      • 用語
        • 必要になったページが存在しない*3:ページフォルト(例外)
        • 不要そうなページを2次記憶装置に退去させる:ページアウト
        • 必要なページを2時記憶装置からロードする:ページイン
    • 方法
      • ページフォルト時のハンドラ(0x0E)にページスワップのためのサブルーチンを登録
      • あまり使われていない論理ページを探してページアウト(PTEのPビットを0にセット)
      • ページフォルトの発生したページのメモリをページイン(PTEビットを1にセット)

  • ページングはデフォルトでOFFになっている。
  • ONにするにはCR0のPGビットを1に設定するが、その前に初期設定として以下の作業が必要
  • ページングが扱う論理アドレスは(リニアアドレス)という

    • アドレスは2段階で仮想化されていることになる。
  • ページフォルトの例外発生時に、リニアアドレスはCR2に格納される

    • CR2にはメモリからアクセスできない。
    • 普通にスタックに積んでくれればC言語から参照できるのでは?何かセキュリティ上の理由が?

はじめて読む486―32ビットコンピュータをやさしく語る

はじめて読む486―32ビットコンピュータをやさしく語る

*1:メモリの総量が1MBとか言ってた時代からすると多いと思う。

*2:ページングは仮想記憶のためだけの仕組みではないように思える

*3:存在しないかはPTEのPビットをみる

*4:セグメントレジスタのセグメントアドレス + オフセットアドレス