我正在上OS类,我们需要扩展XV6的exit()
以支持退出状态,因此我们正在编写exit2(int)
。
为了保存被杀死进程的退出状态,我想到了两个候选人。
第一个选项是为struct proc
添加变量以退出状态。我对这个解决方案的问题在于它涉及到改变操作系统的基本结构的原因很少,而且它意味着我将为每个进程都有一个垃圾整数,这不是最好的主意。
第二个想法是将退出状态保存在被杀死进程的陷阱帧寄存器中,但是我内心有些东西说我不应该相信被杀死进程中eax
的值。
什么是更好的主意? (或者更糟糕的是)
答案 0 :(得分:2)
选项1是最简单和最安全的。
选项2,听起来很奇怪,可以在xv6中运行。
进程exit()
时没有释放内存。
只有当父调用wait()
子进程内存被释放时,
包括子内核栈。
因为在孩子进入ZOMBIE
之后没有人会使用内核堆栈,
退出状态可以存储在内核堆栈的任何位置。
因此,您可以将存在状态存储在proc->kstack-4
并从p->kstack-4
的等待例程中获取它。
只需确保在kfree(p->kstack)
!
答案 1 :(得分:0)
明确的答案是否定的,eax
的目的是用作程序的返回值。在一些内核实现中(我知道它适用于xv6的rev 6)这个技巧可行,但是在eax
之后不能依赖kill()
因为你永远不知道内核何时会实际杀死进程。