• 代码间的跳转


    代码间跳转的执行流程

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

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

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

  • 相关阅读:
    C#学习三之几个关键字Static,ref&out,get&set,readonly
    C#学习二之浅析var类型和enum枚举类型
    C#学习一之HelloWorld
    泛型(二)
    泛型(一)
    JavaScript 使用
    JavaScript
    C# 自定义控件制作和使用实例(winform)
    ThinkPHP 参数绑定原理
    处理jQuery append加入的元素 绑定事件无效的方法
  • 原文地址:https://www.cnblogs.com/a-s-m/p/12764051.html
Copyright © 2020-2023  润新知