![](https://csdnimg.cn/release/download_crawler_static/86344260/bg1.jpg)
思考题部分:
思考题 1.思考并回答下面的问题:
• 内核在保存现场的时候是如何避免破坏通用寄存器的?
• 系统陷入内核调用后可以直接从当时的 $a0-$a3 参数寄存器中得到用户调用 msyscall 留
下的信息吗?
• 我们是怎么做到让 sys 开头的函数“认为”我们提供了和用户调用 msyscall 时同样的参
数的?
• 内核处理系统调用的过程对 Trapframe 做了哪些更改?这种修改对应的用户态的变化是?
答:
(1)保存现场时新建了一个数据栈结构来存放,将通用寄存器存入。内核使用 k0、k1
两个寄存器保存用户栈、取出内核栈。
(2)能,没有改变数据。
(3)系统调用中参数的传递依赖于 a0-a3 参数寄存器和栈。这是汇编决定的,a0-a 寄
存器不变,且我们从栈中取出和存入保持一致就能够让 sys 开头的函数认为参数相同。
(4)v0 寄存器被更改了,首先 v0 用来存放参数 a0 的值,以便从 TF_REG2 中取出操作,
v0 作为系统调用返回值。同时系统调用对 EPC+4 了,使得调用返回后从下一条正常指令执
行。
思考题 2.思考下面的问题,并对这两个问题谈谈你的理解:
• 子进程完全按照 fork() 之后父进程的代码执行,说明了什么?
• 但是子进程却没有执行 fork() 之前父进程的代码,又说明了什么?
答:(1)子进程在 fork 函数才产生,保存了 fork()之后的状态;
(2)生成子进程不会更改父进程原本的状态信息。
思考题 3.关于 fork 函数的两个返回值,下面说法正确的是:
A、fork 在父进程中被调用两次,产生两个返回值
B、fork 在两个进程中分别被调用一次,产生两个不同的返回值
C、fork 只在父进程中被调用了一次,在两个进程中各产生一个返回值
评论0