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

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   |       |         |
	|  :      |       |         |
	+---------+       +---------+

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


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