代码间的跳转
代码间跳转的执行流程
以下面代码为例,看CPU在跳转过程做了什么操作。
jmp 0x20,0x004183d7
(一)段选择子拆分
0x20的二进制形式 0000_0000_0010_0000;
RPL=00;
TI=0;
INDEX=4;
(二)查表得到段描述符
TI=0,所以查GDT表;
INDEX=4,根据索引找到对应的段描述符;
四种情况可以跳转:代码段,调用门,TSS任务段,任务门;
数据段就不行,没有jmp数据段的;
(三)权限检查
如果是非一致代码段,要求:CPL=DPL,并且,RPL<=DPL;
如果是一致代码段,要求:CPL>=DPL;
(四)加载段描述符
通过上面的权限检查后,CPU会将段描述符加载到CS段寄存器中;
(五)代码执行
CPU将CS.Base+Offset的值写入EIP,然后执行CS:EIP指令;
直接对代码段进行JMP或CALL的操作,无论目标是一致代码段还是非一致代码段,CPL都不会发生改变,
如果要提升CPL的权限,值能通过调用门。
-------------------------------------------
滴水中级--代码跨段跳转流程