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 の該当エントリなアドレスを戻す、ということを完全に忘れておりました。