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
という理解で良いのかどうか。