6.828: Operating System Engineering (39)

メモ。なんか微妙なメモばかりでスミマセン。

  • pgdir の要素は 1024 (10bits)
  • ページディレクトリな領域は確保してますが、ページテーブルな領域は確保されていない件について
    • あ、inc/memlayout.h に VPT な領域、って記述があるorz

あと、check_va2pa もきちんと解析必要。

static physaddr_t
check_va2pa(pde_t *pgdir, uintptr_t va)
{
    pte_t *p;

    pgdir = &pgdir[PDX(va)];
    if (!(*pgdir & PTE_P))
        return ~0;
    p = (pte_t*) KADDR(PTE_ADDR(*pgdir));
    if (!(p[PTX(va)] & PTE_P))
        return ~0;
    return PTE_ADDR(p[PTX(va)]);
}

最初 PTE_ADDR を 0xFFF と & とるのだとカン違いしててハマりました。

  • 引数 pgdir な配列の PDX(va) 番目の要素のアドレスを pgdir に格納
    • PDX(va) は va の先頭 10bits を取り出して右に寄せたソレ
  • pgdir は Present な flag が立っていること
  • pgdir からページテーブルのベースアドレスを取り出してリニアアドレスに変換して p に格納する
  • p にはページテーブルのアドレスが格納されている
    • 該当するページテーブルエントリ (p[PTX(va)]) は Present な flag が立っていること
  • p[PTX(va)] からページのベースアドレスを取り出して戻す

おそらくこれで当たってると思うのだけれど、なんとなく腑にオチていない何かがあるな。例えば

  • ページテーブルはどこにあるのか
    • VPT なのか、でもいつ作ってるのかが謎
  • ページディレクトリ、ページテーブル共に phys な address が格納されてるのか
  • flag とか別途なのだろうな
    • inc/memlayout.h のマンガが材料なのかどうなのか

どうも inc/memlayout.h のマンガとか check_boot_pgdir の試験とか見るに pages なソレは UPAGES にマップされる模様?

 *                     |          RO PAGES            | R-/R-  PTSIZE
 *    UPAGES    ---->  +------------------------------+ 0xef000000

試験が以下。

	// check pages array
	n = ROUNDUP(npage*sizeof(struct Page), PGSIZE);
	for (i = 0; i < n; i += PGSIZE)
		assert(check_va2pa(pgdir, UPAGES + i) == PADDR(pages) + i);

他の試験もなんとなくイメージできるようになりました。単体試験万歳。

とは言え

現時点で

  • ページテーブルを作らなければならないはず
  • boot_pgdir な領域も初期設定必要 (ページテーブルも

ちなみに intel のマニュアル下巻によれば PTE_P なフラグは物理メモリに存在する場合に立ってるらしいので、ここで何かを判断できますな。
p[PTX(va)] & PTE_P で、ということなのか。もしかしてこれで pgdir_walk は書けたりなんかするのかな、って気がしてきました。
上記疑問点はまだスルーで良いはず。