1

当我运行 fork 测试时,我有一个 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,并将地址空间指针作为第二个参数传递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 回答