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