kmalloc,vmalloc
Rev.2を表示中。最新版はこちら。
kmalloc(),vmalloc()の処理
kmalloc()2^nサイズのメモリを割り当てる。
確保するメモリはスラブから取得しているため、
割り当てられたアドレス空間には物理ページがマッピング済み。
アドレス空間にマッピングされているページは連続となる。
確保されるアドレス空間はストレートマップされている領域。
確保するメモリはスラブから取得しているため、
割り当てられたアドレス空間には物理ページがマッピング済み。
アドレス空間にマッピングされているページは連続となる。
確保されるアドレス空間はストレートマップされている領域。
vmalloc()
vmalloc用の領域からアドレス空間を割り当てる。
割り当てられたアドレス空間には物理ページがマッピングされていない場合がある(*1)
アドレス空間にマッピングされるページは非連続となる。
割り当てられたアドレス空間には物理ページがマッピングされていない場合がある(*1)
アドレス空間にマッピングされるページは非連続となる。
*1 vmalloc時に物理ページも割り当てるが、プロセスのコンテキストスイッチによりPageTable未設定の状態になる場合がある。
処理の流れ
kmalloc()kmalloc()
__kmalloc()
__find_general_cachep()
スラブのキャッシュから指定サイズを満たすものを探す
__cache_alloc()
キャッシュからオブジェクト(割り当てメモリ)を取得
__kmalloc()
__find_general_cachep()
スラブのキャッシュから指定サイズを満たすものを探す
__cache_alloc()
キャッシュからオブジェクト(割り当てメモリ)を取得
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で管理される
struct vm_struct *vmlist
|
V
struct vm_struct
+---------+ ----> +---------+ ---->
| addr | | |
| size | | |
| pages | | |
| : | | |
+---------+ +---------+