6.828: Operating System Engineering (59)

超へろへろなんですが、続きに着手。
次は kernel stack な試験。

    // check kernel stack
    for (i = 0; i < KSTKSIZE; i += PGSIZE)
        assert(check_va2pa(pgdir, KSTACKTOP - KSTKSIZE + i) == PADDR(bootstack) + i);
    assert(check_va2pa(pgdir, KSTACKTOP - PTSIZE) == ~0);

これって boot_map_segment にどんな情報を渡してどう初期化させれば良いのだろうか。基本的にループの中では PTE_P は立ててるんですが、これも引数に含めてあげればって一瞬思ったんですがダウトなのかビンゴなのか。
あ、pgdir_walk 手続きは page table を云々するので PTE_P は pgdir には立ってる、ってことは page table の PTE_P を操作できるように boot_map_segment は書きかえる必要がある模様。
呼び出し側てきには以下かなぁ。

    boot_map_segment(boot_pgdir, KSTACKTOP - KSTKSIZE, KSTKSIZE, PADDR(bootstack), PTE_P);
    boot_map_segment(boot_pgdir, ULIM, PTSIZE - KSTKSIZE, 0, 0);

あまり何も考えてないです。しかも試験の順番が kernel stack よりも phys mem の方が先だったりする。
仕様なコメントが以下。

    // Map all of physical memory at KERNBASE. 
    // Ie.  the VA range [KERNBASE, 2^32) should map to
    //      the PA range [0, 2^32 - KERNBASE)
    // We might not have 2^32 - KERNBASE bytes of physical memory, but
    // we just set up the mapping anyway.
    // Permissions: kernel RW, user NONE

てきとーに盛り込んで試験してみたらデグレードしてます。以前パスしてた試験にパスしてない。体調へろへろなのでやってることが微妙らしい。休む。