如何通过sys_fork()分叉子进程使其内核堆栈包含陷阱帧?

时间:2011-02-19 22:31:34

标签: c os161

我正在内核级别上执行系统调用sys_fork()。我按照要求将父进程复制到子进程。问题是如何将子的trapframe(父陷阱帧的副本)复制到子内核堆栈上以传递mips_usermode()中的断言?

2 个答案:

答案 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中的堆栈检查。