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 を達成した (チャレンジ課題は手を付けていない)
va
(virtual address) にstruct PageInfo *pp
がマップされている状態で再び va にpp
をマップしたときの挙動を修正 Fix lab2 part2 · itkq/jos@73018e1 · GitHub
ようやくページテーブルあたりをスッキリ理解したのでまとめておく。次のコードは 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 への変換構図は下図のようになる。
struct PageInfo* pages
は物理ページとのマッピングに使われるが、*(struct PageInfo *)
が 4096 bytes なのではない。
物理ページは page_init()
で見ているように、物理メモリのうち未使用の領域を 4096 bytes のチャンクとして扱っているだけである……最初混乱した。
- homework: system calls hw03: finish part1 · itkq/jos@0b46fbb · GitHub hw03: finish part2 · itkq/jos@92c2a5e · GitHub
- 結構かんたん
- homework: xv6 lazy page allocation hw04: finish · itkq/jos@5bb88a1 · GitHub
- lazy allocation とは → on demand 的な理解でいいっぽい。要求があってから (page fault のあとで) alloc
- sbrk = segment break
- わりとすぐ終わった
- Lab3: User Environments
- "UNIX process" と "JOS environment" は interchangable とする
- 眠くなったので終了
3/3
- Lab 3
- Exercise 1
boot_alloc()
とboot_map_region()
するだけ lab3: finish exercize1 · itkq/jos@86204ac · GitHub - Exercise 2 途中
- Exercise 1
- homework: xv6 cpu alarm hw05: finish · itkq/jos@b0a49d6 · GitHub
- 最初なにをしたらいいかわからなかった
- function call を stack frame の操作によって行う
- homework: threads and locking hw06: finish · itkq/jos@bf67194 · GitHub
- 5年ぶりくらいのCでスレッドプログラミング
- まあそうだねって感じ