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

kmalloc,vmalloc


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

kmalloc(),vmalloc()の処理

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

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

*1 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/13 11:30:03 - kztomita
(2006/03/27 13:50:08 作成)
添付ファイル
vmlist.png - kztomita


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