HighMemory
Rev.3を表示中。最新版はこちら。
0xc0000000以降の約1GBのカーネル空間は物理ページに対してストレートにマップされる。カーネルのアドレス空間は1GBまでしかないため、物理メモリを1GB以上実装するとストレートにマップできないメモリができる。このストレートマップされていない高位のメモリをHighMemoryと呼ぶ。正確には896MB以降がHighMemoryとなる。逆にストレートマップされているメモリLowMemoryと呼ばれる。カーネルの使用するデータは基本的にストレートマップされているLowMemに置かないといけないため、プロセスのユーザ空間へのページの割り当てはHighMemoryから優先的に割り当てるようにする。
ユーザデータは出来るだけHighMemoryに追い出してLowMemoryを空ける。カーネルデータはLowMemoryに置かれる(カーネル空間がストレートマップされているため)
<== 大規模なシステムだとカーネルデータが大きくなり、LowMemoryのサイズがネックになってくる
<== PageCache等のカーネルデータもHighMemoryを使えるみたい
カーネルがHighMemoryにアクセスする場合はkmap()を使って一時的にHighMemoryの指定ページをカーネル空間内にマップする。
[関連関数]
kmap(page)
pageがHighMemでなければpage_address()で該当仮想アドレスを返す。
HighMemならkmap_high()->map_new_virtual()でマップ(PTE設定)してアドレスを返す。
# 高速版のkmap_atomic()もある。kmap_atomic()ではマップしている間はsleep禁止。HighMemならkmap_high()->map_new_virtual()でマップ(PTE設定)してアドレスを返す。
# kmap()ではsleepしてよい。
#
# kmap()でマップしたページは PKMAP_BASEからの4MBの領域のどこかにマップされる。
# kmap_atomic()の場合はtypeによって静的に決定される。
# (fixed address領域のFIX_KMAP_BEGINから始まるエリア)
[関連ページ]
アドレス空間
カーネル空間のメモリマップ