0

我正在内核级别上实现系统调用 sys_fork() 。我根据要求将父进程复制到子进程。问题是如何将孩子的trapframe(父trapframe的副本)复制到孩子的内核堆栈上以传递mips_usermode()中的断言?

4

2 回答 2

3

我也在开发 OS161。这是我解决问题的方法。

在 sys_fork 中,我将父级的陷阱帧复制到通过 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 中的堆栈检查。

于 2012-03-07T08:26:28.210 回答
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 只是内核端的一块内存,用于存储与异常或上下文切换相关的任何内容。

请务必先清除 t_stack,然后再使用 trapframe 加载它,因为它将包含与 sys_fork 实现的上下文切换帧相关的数据。

欢迎对此进行任何更正或评论。

于 2011-03-02T23:46:48.570 回答