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〜)からも
アクセスできる(ストレートマッピングは変更されないため)。