signed

QiShunwang

“诚信为本、客户至上”

x86 特权级切换过程

2020/8/20 8:31:44   来源:

通过中断切换特权级
当中断(硬件中断、软中断(INT指令)、异常)产生时,会保存SS|ESP|EFLAGS|CS|EIP|ErrorCode,SS和ESP 表示中断时堆栈信息,CS和EIP 表示中断处理完成后返回的地址,EFLAGS 表示中断时程序标志位(加减、溢出)。

特权级切换原理:
1)高特权级(level0)到低特权级(level3) :直接将CS的CPL从0改成3、再将SS、ESP、EIP赋值为level3 的地址、再通过执行IRET指令完成切换。
2) 低特权级到高特权级 :在level3中使用软中断切换到level0,与此同时cpu会将level3中断的现场信息压入level0的栈,在中断返回前将栈中的CS的CPL从3改成0,且将其地址指向level0 要执行的下一个服务地址,去掉SS、ESP,通过执行IRET指令完成切换。

TSS(Task State Segment) : 用于存储不同特权级堆栈信息的地址,当程序从一个特权级切换到另外一个特权级时,则通过TSS 获取堆栈地址。
TSS 位于内存中,GDT 中保存着指向TSS 的单元,在使用时从GDT中寻找。
TSS 由操作系统在初始化时填充,填充过程如下:
a) Allocate TSS memory
b)Init TSS
c) Fill TSS descriptor in GDT
d) Set TSS selector (设置TSS Register)