代码间的跳转

 

代码间跳转的执行流程

以下面代码为例,看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的权限,值能通过调用门。

-------------------------------------------

滴水中级--代码跨段跳转流程

posted @ 2020-04-23 22:20  AGB  阅读(230)  评论(0编辑  收藏  举报