Rmap
Rev.13を表示中。最新版はこちら。
1. 概要
物理アドレスから仮想アドレス空間のアドレスを逆引きするための仕組み。
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. 関連関数
vma_address()
page_address_in_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()を使用する必要がある。
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ヘのポインタになる。
(page->mapping & PAGE_MAPPING_ANON)の結果。
この関数が真ならpage->mappingはstruct anon_vmaへのポインタ。偽ならstruct address_spaceヘのポインタになる。