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() はまだ通過してないぜ。うーん、もう少しシンプルに考えないと駄目なのかどうなのか。