6.828: Operating System Engineering (60)

デグレ、って言ってましたが、そもそも試験にはパスしていなかった模様です。どうも check_va2pa とか pgdir_walk が戻すのが何か、をちゃんと理解できてない。
控えておくと、

  • check_va2pa は渡された page directory と la から page table entry のアドレスを戻す
  • pgdir_walk も土曜に page directory と la から page table entry のアドレスを戻す
    • 引数の create が 1 で page table が存在しない場合、page table を作ってくれる

と理解してたはずなのですが、何故か page table の先頭アドレスを戻すってナチュラルな思い込みをしてて、pgdir_walk の戻りを先頭に NPTENTRIES 回ループさせて云々という暴挙な実装を盛り込んでいた訳でした。

いやはや

で、現状ですが以下な assert にパスしてません。

        default:
            if (i >= PDX(KERNBASE))
                assert(pgdir[i]);
            else
                assert(pgdir[i] == 0);
            break;

0 の方らしい。printf してみたら i が 955 までは成功している模様。あ、パスしてないのは

            if (i >= PDX(KERNBASE))
                assert(pgdir[i]);

の方らしい。printf なナニとしては出力が以下。

(check_boot_pgdir) i is 976
(check_boot_pgdir) pgdir[i] is 8d001
(check_boot_pgdir) i is 977
(check_boot_pgdir) pgdir[i] is 0

ちなみに printf したソレなのですが

(check_boot_pgdir) PDX(VPT) is 959
(check_boot_pgdir) PDX(UVPT) is 957
(check_boot_pgdir) PDX(KSTACKTOP-1) is 958
(check_boot_pgdir) PDX(UPAGES) is 956

ということらしい。page directory の値が微妙なのか。1024 あるエントリのうち、977 以降が微妙ってことなのかどうなのか。assert ではなくて数を数えてみる?

        default:
            if (i >= PDX(KERNBASE)) {
                if(pgdir[i] == 0) n++;
            }
            else
                assert(pgdir[i] == 0);
            break;
        }
    }
    cprintf("(check_boot_pgdir) n is %d\n", n);
    assert(!n);

出力が以下らしい。

(check_boot_pgdir) n is 47
kernel panic at kern/pmap.c:413: assertion failed: !n

977 に 47 足したら 1024 っぽいなorz
ケツの部分の初期化ができてない、というアタリを付けてソースを確認してみますが、へろへろなので今日は多分これで終わり。