zoukankan      html  css  js  c++  java
  • 代码间的跳转

    代码间跳转的执行流程

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

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

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

  • 相关阅读:
    工作总结
    JSON数据使用
    DataTable知识
    树形结构菜单
    区域树前后台
    跨域总结
    工作一年感想
    项目整体架构分析
    springboot 和 mongdb连接问题 Exception in thread "main" com.mongodb.MongoSecurityException:
    go函数、方法、接口笔记
  • 原文地址:https://www.cnblogs.com/a-s-m/p/12764051.html
Copyright © 2011-2022 走看看