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

HighMemory


Rev.1を表示中。最新版はこちら

カーネル空間(0xc0000000〜)からストレートマップされていないメモリ
896MB以降

ユーザ空間へのページの割り当てはGFP_HIGHUSERで積極的にHighMemoryを使用する。
(malloc()した領域もHIGHMEMからとられているっぽい。)

ユーザデータは出来るだけHighMemoryに追い出してLowMemoryを空ける。
カーネルデータはLowMemoryに置かれる(カーネル空間がストレートマップされているため)
<== 大規模なシステムだとカーネルデータが大きくなり、LowMemoryのサイズがネックになってくる
<== PageCache等のカーネルデータもHighMemoryを使えるみたい


カーネルがHighMemoryにアクセスする場合はkmap()を使って
一時的にHighMemoryの指定ページをカーネル空間内にマップする。
# 高速版のkmap_atomic()もある。kmap_atomic()ではマップしている間はsleep禁止。
# kmap()ではsleepしてよい。
#
# kmap()でマップしたページは PKMAP_BASEからの4MBの領域のどこかにマップされる。
# kmap_atomic()の場合はtypeによって静的に決定される。
# (fixed address領域のFIX_KMAP_BEGINから始まるエリア)


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


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


最終更新 2006/07/03 22:33:29 - kztomita
(2006/07/03 22:33:29 作成)


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