6.828: Operating System Engineering (39)
メモ。なんか微妙なメモばかりでスミマセン。
- pgdir の要素は 1024 (10bits)
- アロケーションサイズは 4096 なのは要素の大きさが 4bytes (pde_t) だから?
- ページディレクトリな領域は確保してますが、ページテーブルな領域は確保されていない件について
- あ、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 は書けたりなんかするのかな、って気がしてきました。
上記疑問点はまだスルーで良いはず。