1

我正在学习 OS 课程,我们需要扩展 XV6exit()以支持退出状态,因此我们正在编写exit2(int).

为了保存被杀死进程的退出状态,我想到了两个候选者。

  1. 第一个选项是struct proc为退出状态添加一个变量。我对这个解决方案的问题是,它涉及到一个很小的原因改变操作系统的基本结构,而且这意味着我将为每个进程都有一个垃圾整数,这不是最好的主意。

  2. 第二个想法是将退出状态保存在被杀死进程的陷阱帧寄存器中,但是我内心有一些东西说我不应该相信eax被杀死进程中的值。

有什么更好的主意?(或更糟)

4

2 回答 2

2

选项 1 是最简单和最安全的。

选项 2,虽然听起来很奇怪,但可以在 xv6 中运行。exit()进程s时不会释放内存。只有当父进程调用wait()子进程时,内存才会被释放,包括子内核堆栈。

由于在 child 离开后没有人会使用内核堆栈ZOMBIE,因此退出状态可以存储在内核堆栈的任何位置。

因此,您可以将存在状态存储在proc->kstack-4 并在等待例程中从p->kstack-4. 只要确保在kfree(p->kstack)!

于 2015-01-03T19:12:38.507 回答
0

肯定的答案是否定的,目的eax是用作程序的返回值。在某些内核实现中(我知道它适用于 xv6 的 rev 6),这个技巧可能会起作用,但不能依赖eaxa 之后,kill()因为你永远不知道内核何时会真正杀死进程。

于 2014-12-09T07:47:06.083 回答