Linux Kernel(2.6)の実装に関するメモ書き

Rmap


1. 概要

物理アドレスから仮想アドレス空間のアドレスを逆引きするための仕組み。

スワップ処理でページをページアウトする時には、その物理ページにマップしているユーザー空間をアンマップする必要がある。この時、Rmapを使うことで物理ページへマップしているユーザ空間を高速に取りだせる。

2. データ構造

Rmapのデータ構造を図1に示す。



図1 Rmapのデータ構造

物理ページの管理構造体であるstruct pageからanon_vma経由で物理ページにマッピングされている仮想アドレス空間(vma)を全て取得することができる。

struct pageのmappingは通常struct address_space(*1)へのポインタだが、PAGE_MAPPING_ANON(1)がセットされていたら、struct anon_vmaへのポインタであることを示す。

struct anon_vmaからこの物理ページに対応するstruct vm_area_structのリストをたどる事ができる。(anon_vma_nodeが同じanon_vmaを持つvm_area_structの双方向リストになっている)

vm_area_structのanon_vmaは自分の所属しているanon_vmaへのポインタを保持している。

(*1) address_spaceはディスク上のファイルを物理ページ上にマッピングしてPageCache(ディスクキャッシュ)を構築するのに使用される物理ページの管理構造体。「PageCache」参照。

3. 関連関数


page_address_in_vma(page, vma)
ページのユーザ空間(vma)の仮想アドレスを取得する。

anon_vma_prepare(vma)
struct anon_vmaを割り当てて、anon_vmaのリストにvmaをチェーンする。

page_add_new_anon_rmap(page, vma, address)
pageとvmaを関連づける。
page->mappingにvma->anon_vmaのアドレスを設定する。
vmaは事前に anon_vma_prepare()でanon_vmaが用意されていないといけない。
page->indexには仮想アドレスaddressに対応するページ番号が格納される。

似た関数としてpage_add_anon_rmap()があるが、こちらは、page->_mapcountを見て初回のみ上記の処理を行うようになっている。新規に物理ページをマッピングする場合はpage_add_new_anon_rmap()を使用する必要がある。

PageAnon(page)
ページがanon_vmaを持っているかを返す。
(page->mapping & PAGE_MAPPING_ANON)の結果。
この関数が真ならpage->mappingはstruct anon_vmaへのポインタ。偽ならstruct address_spaceヘのポインタになる。

4. 参考

vm_area_structについては「アドレス空間の管理」参照

最終更新 2007/03/30 01:23:13 - kztomita
(2006/03/27 13:52:43 作成)
添付ファイル
rmap.png - kztomita


リンク
最近更新したページ
検索