我正在内核级别上执行系统调用sys_fork()。我按照要求将父进程复制到子进程。问题是如何将子的trapframe(父陷阱帧的副本)复制到子内核堆栈上以传递mips_usermode()中的断言?
答案 0 :(得分:3)
我发现了我的问题。
但我要说的是与OS161系统有关。所以在这个系统上工作的人都会有所帮助。
好的,内核端有一个处理上下文切换的函数。此函数将与上下文切换帧相关的所有数据存储到线程内核堆栈中。
所以你需要做的就是按照相同的步骤而不是切换框架结构,你需要用陷阱框架结构替换它。
以下是它的实现: -
vaddr_t stacktop;
struct trapframe *tf;
stacktop = ((vaddr_t)thread->t_stack) + STACK_SIZE; //t_stack is the kernel stack
tf = ((struct trapframe *) stacktop) - 1;
t_stack只是内核端的一块内存,用于存储与异常或上下文切换相关的任何内容。
在使用trapframe加载之前,请务必先清除t_stack,因为它将包含与sys_fork实现的上下文切换帧相关的数据。
欢迎对此进行任何更正或评论。
答案 1 :(得分:3)
我也在研究OS161。以下是我如何解决这个问题。
在sys_fork中,我将父级的trapframe复制到通过kmalloc分配的内核堆空间中:
struct trapframe* ctf = (struct trapframe*)kmalloc(sizeof(struct trapframe));
*ctf = *tf; // tf points to parent's trapframe;
然后我使用thread_fork创建子线程:
// passing address space using the second parameter of
// child_forkentry, quite dirty
thread_fork(curthread->t_name, child_forkentry, ctf, (unsigned long)as, NULL);
在child_forkentry中,这是孩子调用的第一个函数,我执行以下操作:
struct trapframe tf; // tf will be allocated on child's kernel stack
tf = *ctf
misp_usermode(&tf);
这将通过mips_usermode中的堆栈检查。