• 代码间的跳转


    代码间跳转的执行流程

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

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

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

  • 相关阅读:
    get与post的区别
    细数28个服务器端控件
    学习笔记
    是Attribute,还是Property
    学习日记
    C#常见面视题(附答案)
    扩展GridView(八)——导出为Excel
    如何实现ObjectDataSource与GridView的分页操作
    asp.net程序性能优化总结
    Array和ArrayList的异同点
  • 原文地址:https://www.cnblogs.com/a-s-m/p/12764051.html
Copyright © 2020-2023  润新知