kmalloc,vmalloc
kmalloc(),vmalloc()の処理
kmalloc()2^nサイズのメモリを割り当てる。
確保するメモリはスラブから取得(*1)しているため、割り当てられたアドレス空間には物理ページがマッピング済み。
アドレス空間にマッピングされているページは連続となる。
確保されるアドレス空間はストレートマップされている領域。
*1 スラブから取得しているため、確保した量は/proc/slabinfoで確認できる。(size-32,size-64,...で表示されている箇所)
確保するメモリはスラブから取得(*1)しているため、割り当てられたアドレス空間には物理ページがマッピング済み。
アドレス空間にマッピングされているページは連続となる。
確保されるアドレス空間はストレートマップされている領域。
*1 スラブから取得しているため、確保した量は/proc/slabinfoで確認できる。(size-32,size-64,...で表示されている箇所)
vmalloc()
vmalloc用の領域からアドレス空間を割り当てる。
割り当てられたアドレス空間には物理ページがマッピングされていない場合がある(*2)
アドレス空間にマッピングされるページは非連続となる。
割り当てられたアドレス空間には物理ページがマッピングされていない場合がある(*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