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 あたりの実装を検討しつつ、本当に大丈夫かどうかを検証する方向で続行の方向です。