- https://kiprey.github.io/2020/08/uCore-1/
- 学堂在线清华大学的Ucore实验指导书以及在线视频
第一点是一个博客,很优秀的文章,包含了很多内容,借以引用。再在此基础上写点自己的笔记。
第二点的内容是我认为需要仔细阅读和学习的,很有帮助。
(君子生非异也,善假于物也)
下面是一些笔记:特权级切换
iret指令是中断服务子程序的返回指令。
程序执行这条 iret 指令时,首先会从内核栈里弹出先前保存的被打断的程序的现场信息,即 eflags,cs,eip 重新开始执行; 如果存在特权级转换(从内核态转换到用户态),则还需要从内核栈中弹出用户态栈的 ss 和 esp,这样也意味着栈也被切换回原先使用的用户态的栈了; - 如果此次处理的是带有错误码(errorCode)的异常,CPU 在恢复先前程序的现场时,并不会弹出 errorCode。这一步需要通过软件完成,即要求相关的中断服务例程在调用 iret 返回之前添加出栈代码主动弹出 errorCode。
x86特权级 0to3 :
计算机启动的时候的代码都是在内核态运行,通过中断切换特权级。产生中断是从0特权级到0特权级,不会发生切换栈的动作,会在当前栈压入一些内容,我们要将内核栈模仿成一个用户栈,压入SS SP ,将CPL改成3,通过iret指令完成特权级的切换。
x86特权级 3to0:
一旦产生中断,就会产生栈的切换,在内核栈中会压入用户态的SS SP CS IP 等信息,通过iret 指令还是会返回到3特权级,我们想让其留在0特权级,我们将修改栈,丢掉用户的SS, SP ,修改CS中的CPL为0。然后通过iret指令返回就完成了特权级的切换。
标签:Ucore,iret,用户,lab1,指令,内核,相关,特权,切换 From: https://www.cnblogs.com/wuyun--wy/p/17018200.html