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 含め、試験な手続きをちゃんと確認する方向で。