中断很久,一看发现又多了一些内容。
打算完成了
Lab1 challenge 1
中断像量表设置的时候我们需要设置一个用于系统调用的 trap门
也就是
利用中断切换特权级
To kernel
调用 Tokernel 的时候由于由特权及的转换,所以这里会在 Tss 中取出当前函数的内核栈 并且做相应的切换
依次压栈 eflags cs eip err trapno ds es sf gs tregs 等
将这个 调用栈压入 栈中
最后执行 push esp 这样是把 栈顶的指针放在栈顶作为tarp 的参数 tf 传入
在dispatch 中 增加一个另外的空间将修改后的 trapframe 填入
将新的 指针入栈
这样 Pop 的时候 也就返回的时候会使用新的 esp 栈作为返回
iret 的时候 会客而已进行正确的执行了
因为压栈的时候压栈了 esp 和 ss ,但是出栈的时候不需要 esp 和 ss 所以返回的栈帧 中没有 esp 和 ss ??
To User
压栈的时候压栈了 调用栈帧 但是不完整
所以在另外一个地方申请一个栈帧 完整设置esp 和 ss 返回
解答:
就硬件来说,执行iret时存在两种情况,一是栈上保存的CS的权限级别(内核态或用户态)与当前一致,不考虑ss和esp;二是栈上保存的权限级别与当前不同,需要恢复ss和esp。OS的任务,是利用iret的功能,在修改CS的同时不改动其它寄存器的值。
(所以to kernel 的时候iret 会发现cs 的特权及一致(已经修改过了,从而没有esp 和 ss))
(to user 同理)
附:lab1_prinit_cur_status
是输出了当前几个寄存器的置 cs 段的特权级位也被输出用于检查
原文地址:https://www.cnblogs.com/sfzyk/p/9710916.html