C OS161:负载时TLB未命中

C OS161:负载时TLB未命中,c,memory-management,mips,tlb,os161,C,Memory Management,Mips,Tlb,Os161,当我运行fork测试时,我有一个TLB负载丢失错误,我知道这是因为将错误的stackptr传递给mips_usermode,我的实现似乎围绕着这里的一些建议,如果我得到纠正,我将不胜感激。我下面的代码是作为thread_fork中的入口点函数提供的。我有什么遗漏吗 void enter_forked_process(void *junk,unsigned long num) { kprintf("\n entered enter_fork_process");

当我运行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);
}

在调用
thread\u fork
之前,必须复制父线程的地址空间,并将地址空间指针作为
enter\u forked\u process
的第二个参数传递。在
输入forked\u process
时,必须将地址空间填充到
curthread->t\u addrspace
中。否则,由于当前线程(子线程)的地址空间未初始化,您将得到
TLB miss-on-load
错误

有关OS161 fork系统调用的更多详细信息,请参阅本博客。而
child\u forked\u entry
与您的
enter\u forked\u过程差不多。

还必须注意同步…此处链接已断开。这是一本书。