我在运行fork测试时有一个TLB miss on load错误,我知道这是由于将错误的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_fork
之前,必须复制父线程的地址空间,并将地址空间指针作为enter_forked_process
的第二个参数传递。在enter_forked_process
中,您必须将地址空间填充到curthread->t_addrspace
中。否则,将出现TLB miss on load
错误,因为当前线程(子线程)的地址空间未初始化。
有关OS161 fork系统调用的更多详细信息,请参阅此博客。而且child_forkentry
和你的enter_forked_process
差不多。
http://jhshi.wordpress.com/2012/03/11/os161-fork-system-call/
关于c - OS161:TLB加载失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9881404/