無料Wikiサービス | デモページ | [広告] サイト検索サービス Sx4
Linux Kernel(2.6)の実装に関するメモ書き
最近更新したページ
2008/1/14
2008/1/13
2007/12/9
2007/10/5
2007/9/28
2007/9/27
2007/8/22
2007/8/21
検索

HighMemory


0xc0000000以降の約1GBのカーネル空間は物理ページに対してストレートにマップされる(図1)。カーネルのアドレス空間は1GBまでしかないため、物理メモリを1GB以上実装するとストレートにマップできないメモリができる。このストレートマップされない高位のメモリをHighMemoryと呼ぶ。正確には896MB以降がHighMemoryとなる。逆にストレートマップされているメモリLowMemoryと呼ばれる。


図1 LowMemoryとHighMemory

カーネルの使用する多くのデータは基本的にストレートマップされているLowMemに置かないといけないものが多いため(*1)(*2)、大規模なシステムだとカーネルデータが大きくなり、LowMemoryのサイズがネックになってくる。このため、プロセスのユーザ空間へのページの割り当てなどはHighMemoryから優先的に割り当てるようして、LowMemoryを圧迫しないようにしている。

(*1) PTE(PageTableEntry)なども基本的には、LowMemoryに置かないといけないが、CONFIG_HIGHPTEを定義することでHighMemoryの方に追い出せる。
(*2) PageCacheについてもHighMemoryを使用するようになっており、大量のキャッシュを保持してもLowMemoryを圧迫しないようになっている。

カーネルがHighMemoryにアクセスする場合はkmap()を使って一時的にHighMemoryの指定ページをカーネル空間内にマップする。

[関連関数]
kmap(page)
pageがHighMemでなければpage_address()で該当仮想アドレスを返す。
HighMemならkmap_high()->map_new_virtual()でマップ(PTE設定)してアドレスを返す。

高速版のkmap_atomic()もある。kmap_atomic()ではマップしている間はsleep禁止。kmap()ではsleepしてよい。

kmap()でマップしたページは PKMAP_BASEからの4MBの領域のどこかにマップされる。
kmap_atomic()の場合はtypeによって静的に決定される(fixed address領域のFIX_KMAP_BEGINから始まるエリア)。

[関連ページ]
アドレス空間
カーネル空間のメモリマップ


最終更新 2007/3/19 14:21:04 - kztomita
(2006/7/3 22:33:29 作成)