6.828: Operating System Engineering (40)
pgdir_walk 手続き
直前エントリな理解で再度手続き冒頭のコメントを確認。
- page table entry のポインタを戻す
- va を使って page directory を検索して、取得すれば良いはず
- page directory に page table が無い、というのは存在フラグが云々というソレかと
- page_alloc と allocate a new page table の関連がイメージできぬ
むむ
なんとなく pages と物理メモリと page table entry の関連がががが。
戻りはイメージできてて以下な試験も理解できてます。
// check that pgdir_walk returns a pointer to the pte ptep = KADDR(PTE_ADDR(boot_pgdir[PDX(PGSIZE)])); assert(pgdir_walk(boot_pgdir, (void*)PGSIZE, 0) == ptep+PTX(PGSIZE));
あるいは以下なあたり?
// free pp0 and try again: pp0 should be used for page table page_free(pp0); assert(page_insert(boot_pgdir, pp1, 0x0, 0) == 0); assert(PTE_ADDR(boot_pgdir[0]) == page2pa(pp0)); assert(check_va2pa(boot_pgdir, 0x0) == page2pa(pp1));
va が 0x0 なソレを pp1 に map する。コメントによれば pp0 が解放されたので pp1 な領域が確保できる、ということらしい。
うーん、上記がビンゴなら page_alloc の実装はダウトだなぁ。帰ったら page_check 含め、試験な手続きをちゃんと確認する方向で。