6.828: Operating System Engineering (33)
ええとコメントによれば
- pages 配列の 0 番目は使えない
- 1 番目から IOPHYSMEM/PGSIZE -1 番目は使える
- IOPHYSMEM/PGSIZE 番目から EXTPHYSMEM/PGSIZE 番目は使えない
- EXTPHYSMEM/PGSIZE 番目から ROUNDUP(boot_freemem, PGSIZE)/PGSIZE 番目は使えない
- 以降は使える
ということで良いのかな。なんか最後らへんが微妙。
と、思ったら check に以下なコードあり。
assert(page2kva(pp0) != ROUNDDOWN(boot_freemem - 1, PGSIZE));
ちょっと気持ち悪い。大丈夫かなぁ。ROUNDDOWN(boot_freemem - 1, PGSIZE)/PGSIZE 番目までは使えない、の方が良い?
で、ROUNDUP(boot_freemem, PGSIZE)/PGSIZE 番目以降が使える、という方が分かり易いですね。
で、
これをどう書いたものやら。でっち上がったのが以下。
int i; LIST_INIT(&page_free_list); for (i = 0; i < npage; i++) { if (i == 0) { pages[i].pp_ref = 1; } else if (i >= IOPHYSMEM/PGSIZEW && i <= EXTPHYSMEM/PGSIZE) { pages[i].pp_ref = 1; } else if (i <= ROUNDDOWN(boot_freemem - 1, PGSIZE)/PGSIZE) { pages[i].pp_ref = 1; } else { pages[i].pp_ref = 0; LIST_INSERT_HEAD(&page_free_list, &pages[i], pp_link); } }
む、これって以下な方が良さげかも。
} else if (i >= IOPHYSMEM/PGSIZEW && i <= ROUNDDOWN(boot_freemem - 1, PGSIZE)/PGSIZE) { pages[i].pp_ref = 1; } else {
あ、コンパイルエラーが出た。上記部分修正して以下。
} else if (i >= IOPHYSMEM/PGSIZE && i <= (uintptr_t)ROUNDDOWN(boot_freemem - 1, PGSIZE)/PGSIZE) { pages[i].pp_ref = 1; } else {
で、デバッガ起動してみたのですが、breakpoint の設定方法忘れてる。そのまま c したら panic しました。
以下をコメントアウトしてねぇ。
// Delete this line: panic("i386_vm_init: This function is not finished\n");
で、実行してみたんですが、一応 check_page_alloc の page_free_list なソレはパスしてるみたいに見えます。とりあえず alloc あたりの実装を検討しつつ、本当に大丈夫かどうかを検証する方向で続行の方向です。