操作系统 Lab1(2)

中断很久,一看发现又多了一些内容。
打算完成了

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值