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

kmalloc,vmalloc


kmalloc(),vmalloc()の処理

kmalloc()
2^nサイズのメモリを割り当てる。
確保するメモリはスラブから取得(*1)しているため、割り当てられたアドレス空間には物理ページがマッピング済み。
アドレス空間にマッピングされているページは連続となる。
確保されるアドレス空間はストレートマップされている領域。

*1 スラブから取得しているため、確保した量は/proc/slabinfoで確認できる。(size-32,size-64,...で表示されている箇所)

vmalloc()
vmalloc用の領域からアドレス空間を割り当てる。
割り当てられたアドレス空間には物理ページがマッピングされていない場合がある(*2)
アドレス空間にマッピングされるページは非連続となる。

*2 vmalloc時に物理ページも割り当てるが、プロセスのコンテキストスイッチによりPageTable未設定の状態になる場合がある。


処理の流れ

kmalloc()の処理の流れ
kmalloc()
__kmalloc()
__find_general_cachep()
スラブのキャッシュから指定サイズを満たすものを探す
__cache_alloc()
キャッシュからオブジェクト(割り当てメモリ)を取得

vmalloc()の処理の流れ
vmalloc()
__vmalloc()
get_vm_area()
割り当てるアドレス空間用のstruct vm_structをkmalloc()
vmlistをなめて指定サイズの空きがある領域を探す
vm_structを作成&vmlistに挿入

__vmalloc_area()
必要ページ数分をalloc_page()で割り当て。
割り当てたページはarea->pages[i]に保存

map_vm_area() - init_mmにPageTable設定

関連データ構造

vmallocにより確保されたアドレス空間はvmlistで管理される


図1 vmlist


最終更新 2006/06/21 00:51:55 - kztomita
(2006/03/27 13:50:08 作成)
添付ファイル
vmlist.png - kztomita


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