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

vmalloc


vmalloc

	vmalloc用の仮想アドレス空間と必要な物理ページを確保する。
	物理ページはBuddySystemから確保。
	連続ページになるとは限らない。
	PTEの設定は遅らせるので、vmalloc()で取得した領域にアクセスすると
	一旦Pagefaultが発生する。


vmalloc用仮想アドレス空間の管理
	vmlist
	+------+      +------+
	|      |----->|      |----->
	| addr |      |      |
	| size |      |      |
	+------+      +------+

	各仮想アドレス空間に対して、どの物理アドレスにマッピングされているかは
	本テーブルではわからない。
	仮想<-->物理アドレスの対応は下記、init_mm参照のこと。


カーネル用PTEテーブル管理構造体
init_mm
	本構造体に登録されているPGDにより、vmallocの仮想アドレスに対応する
	物理アドレス(物理ページ)を管理する。

	<-- これはあくまで参照用?
	CPUが本当に参照しているわけではない。
	ページフォルトが発生したときに、本参照用テーブルから
	本当の変換テーブルに設定することで
	実際に物理ページが割り当てられる?

	余計なTLBのFlush等を削減するため?


vmalloc()
	get_vm_area()
		vmlistに指定したサイズ分の仮想アドレス空間のvm_structを挿入する

	vmalloc_area_pages()
		pmd_alloc()
			i386ではPMDが無いので、実質なにもしない。
		alloc_area_pmd()
			pte_alloc(&init_mm, pmd, address) <-- PTEを作成する
				pte_alloc_one_fast()
				pte_alloc_one()
					get_free_page(GFP_KERNEL) <-- PTE用にBuddySystemから1ページ取得

			alloc_area_pte()
				alloc_page() <-- BuddySystemから1Page取得
				pte_alloc()で作成したPTEを設定する(割り当てられた物理Pageを指すようにする)。
				<-- サイズ分ループさせるので
				    物理的に連続ページにはならない。

				<-- 物理ページ割り当てを遅らせたりはしない???
					キャッシュに登録しているだけ?
					物理ページの確保はしてあるが、PTEの設定を遅らせている?

	flush_tlb_all()


[メモ]
	vmalloc()で割り当てられた物理ページはカーネル空間(0xc0000000〜)からも
	アクセスできる(ストレートマッピングは変更されないため)。

最終更新 2006/03/27 14:13:52 - kztomita
(2006/03/27 14:13:52 作成)


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