JOS 6週目

2/26

  • Lab2 part3: Kernel Address Space を読むが進捗は無し

2/27

  • アイカツ武道館 Day 1 に行って来年の今頃どんな景色を見つめたいのか考える

2/28

  • アイカツ武道館 Day 2 に行って輝きに包まれる

3/1

  • Lab 2 part3 を実装 Finish lab2 · itkq/jos@a4b73fc · GitHub
    • 特にヒントは書いてないが boot_map_region() を実装すれば良いことが分かった
    • 要件通り Page Table Page を alloc して check_kern_pgdir() は通るが check_page_installed_pgdir() でコケる
    • part 2 で実装した部分が微妙に間違っているっぽい…

3/2

  • Lab 2: Memory Management を達成した (チャレンジ課題は手を付けていない)

ようやくページテーブルあたりをスッキリ理解したのでまとめておく。次のコードは pmap.c の一部である。

// pmap.c
// static void check_page(void)

    // should be able to allocate three pages
    pp0 = pp1 = pp2 = 0;
    assert((pp0 = page_alloc(0)));
    assert((pp1 = page_alloc(0)));
    assert((pp2 = page_alloc(0)));

    assert(pp0);
    assert(pp1 && pp1 != pp0);
    assert(pp2 && pp2 != pp1 && pp2 != pp0);

    // temporarily steal the rest of the free pages
    fl = page_free_list;
    page_free_list = 0;

    // should be no free memory
    assert(!page_alloc(0));

    // there is no page allocated at address 0
    assert(page_lookup(kern_pgdir, (void *) 0x0, &ptep) == NULL);

    // there is no free memory, so we can't allocate a page table
    assert(page_insert(kern_pgdir, pp1, 0x0, PTE_W) < 0);

    // free pp0 and try again: pp0 should be used for page table
    page_free(pp0);
    assert(page_insert(kern_pgdir, pp1, 0x0, PTE_W) == 0);
    assert(PTE_ADDR(kern_pgdir[0]) == page2pa(pp0));
    assert(check_va2pa(kern_pgdir, 0x0) == page2pa(pp1));
    assert(pp1->pp_ref == 1);
    assert(pp0->pp_ref == 1);

    // should be able to map pp2 at PGSIZE because pp0 is already allocated for page table
    assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W) == 0);
    assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp2));
    assert(pp2->pp_ref == 1);

このコードが期待する、linear address から physical address への変換構図は下図のようになる。

f:id:itkq:20180302170509p:plain

struct PageInfo* pages は物理ページとのマッピングに使われるが、*(struct PageInfo *) が 4096 bytes なのではない。 物理ページは page_init() で見ているように、物理メモリのうち未使用の領域を 4096 bytes のチャンクとして扱っているだけである……最初混乱した。

3/3