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
ケツの部分の初期化ができてない、というアタリを付けてソースを確認してみますが、へろへろなので今日は多分これで終わり。