ELF リハビリ
ローダはプログラムヘッダ・テーブルからセグメントの情報を取得して云々、というあたりが分かれば segment_alloc が何をしなければならないか、は類推可能。
以下のコメントも成程、というカンジ。
// You should round va down, and round len up.
呼び出し的には
segment_alloc(env, x->p_va, x->p_memsz);
みたいなカンジになるのかな。
とは言え実装の具体的な部分のイメージが微妙かも。特に
// Allocate len bytes of physical memory for environment env,
// and map it at virtual address va in the environment's address space.
の部分がアレ。page_insert して page table 作って、該当エントリに確保したページを割り当ててあげれば良いのでしょうが、どうやるんだったか。
長いリハビリを経て
page_alloc して page_insert に渡すのか、ということにようやく (ry
ええと、va は
va = ROUNDDOWN(va, PGSIZE);
あるいは len は
len = ROUNDUP(len, PGSIZE);
ってことで良いのかな。で、以下なカンジで繰替えしゃ良いのかどうなのか。
int i; for(i = 0; i < len; i += PGSIZE) { // page_alloc // page_insert }
てゆーか ELF なリハビリはこの先の load_icode 手続きなんですが、いつまでもこっち対応してられないので一旦ストップ。
ちなみに
pgdir_walk 手続きが page table の該当エントリなアドレスを戻す、ということを完全に忘れておりました。