1

フォーク テストを実行すると、TLB ミス オン ロード エラーが発生します。これは、誤った stackptr を mips_usermode に渡すことが原因であることを理解しています。私の実装は、ここでいくつかの提案を中心に展開しているようです。以下のコードは、thread_fork のエントリ ポイント関数として提供されます。私は何かを見逃していますか?

void
enter_forked_process(void *junk,unsigned long num)
{

        kprintf("\n entered enter_fork_process");
        struct trapframe tf = (*((struct trapframe *) junk));


        (void) num;


        kprintf("\n copied tf from from parent to child");
        tf.tf_v0 = 0;
        tf.tf_a3 = 0;
        tf.tf_epc += 4;
        kprintf("abt to enter mips_ usermode");
        mips_usermode(&tf);
}
4

1 に答える 1

2

を呼び出す前に、親スレッドのアドレス空間をコピーthread_forkし、アドレス空間ポインターを の 2 番目のパラメーターとして渡す必要がありますenter_forked_process。ではenter_forked_process、アドレス空間を に入力する必要がありますcurthread->t_addrspace。そうしないとTLB miss on load、現在のスレッド (子) のアドレス空間が初期化されていないため、エラーが発生します。

OS161 fork システムコールの詳細については、こちらのブログを参照してください。そしてchild_forkentry、多かれ少なかれあなたと同じenter_forked_processです。 http://jhshi.me/2012/03/11/os161-fork-system-call/index.html

于 2012-03-28T07:15:37.357 に答える