6.828: Operating System Engineering (58)

体調不良気味。とりあえず昨日の続きから着手。
とりあえず boot_map_segment の検討から。プロトタイプとコメントを以下に。

// Map [la, la+size) of linear address space to physical [pa, pa+size)
// in the page table rooted at pgdir.  Size is a multiple of PGSIZE.
// Use permission bits perm|PTE_P for the entries.
//
// This function is only intended to set up the ``static'' mappings
// above UTOP. As such, it should *not* change the pp_ref field on the
// mapped pages.
//
// Hint: the TA solution uses pgdir_walk
static void
boot_map_segment(pde_t *pgdir, uintptr_t la, size_t size, physaddr_t pa, int perm)

手順としては

  • pgdir_walk(pgdir, la, 0) で page table があるかを確認
    • 無ければ pgdir_walk(pgdir, la, ~0) で作成
  • PGSIZE 増分しつつ size まで繰り返しつつ page table に登録
    • 始点がどうなのか、については無問題?

pgdir の存在フラグ落とす部分はこの手続きの範疇外なのかな。

boot_map_segment 手続きを書いて試験してみたのですがパスしない。よくよく考えたら i386_vm_init でこの手続きを呼び出してないのだから通る訳ゃない。
試しに PAGES なソレを盛り込んでみたのですが、検討が足りてないことに気がつきました。引数の size が PTSIZE より大きかったら page table は複数作らんと駄目なんですね。本当かなぁ。
と言いつつ盛り込んでみたら PAGES な試験はパスしました。ただ、UPAGES に設定しなきゃいけない permission な引数を設定できてないことと、pages それ自身に権限付けなきゃいけないらしいのですが、どうやるのかが不明な問題があったりしてます。

もうちょい

ええと、

    //    - the new image at UPAGES -- kernel R, user R
    //      (ie. perm = PTE_U | PTE_P)
    //    - pages itself -- kernel RW, user NONE

な意図としては UPAGES を指す pde に kernel R, user R な権限設定して、page table entry については kernel RW, user NONE という理解で良いのかなぁ
フラグの具合てきには

  • R-/R- だと PTE_U
  • RW/-- だと PTE_W
  • RW/RW だと PTE_W|PTE_U

という理解で良いのかどうか。