6.828: Operating System Engineering (37)
結局は pgdir_walk からなのだなと。でもページングのナニがイマイチ分かってないかも。そもそも inc/memlayout.h がなんちゃらなあたりの理解が微妙だはず。inc/mmu.h が云々のあたりも同様か。
ええと
pages のインデクスが phys address に直結してるのはビンゴっぽい。
* Each Page describes one physical page. * You can map a Page * to the corresponding physical address * with page2pa() in kern/pmap.h.
マクロの定義が kern/pmap.h で以下。
static inline ppn_t page2ppn(struct Page *pp) { return pp - pages; } static inline physaddr_t page2pa(struct Page *pp) { return page2ppn(pp) << PGSHIFT; }
4096 掛ける形になるはずなので PGSHIFT は 12 bits で良いはず。pages が確保されてる場所はあまり関係ないな。
あと理解が微妙なのが linear address と pages とのマッピング。でもこれってリニアアドレスから求めてく check_va2pa なソレがそのまんまなのか。
これ、以前以下な控えを残してますな
- boot_pgdir を UPAGES で物理アドレスに変換したアドレスは pages 配列の物理アドレスと同値でなければならない
- ええと、KERNBASE は 0 にマップされるの?
- Kernel Stack のてっぺんは bootstack の物理アドレスにマップされる?
スルーしてたんですが bootstack って微妙。てーか、何故になんにもしてないのに UPAGES と pages がマップされてるんだ。
と思ったら
check_boot_pgdir() はまだ通過してないぜ。うーん、もう少しシンプルに考えないと駄目なのかどうなのか。