X86汇编语言:从实模式到保护模式(代码+注释)--c10、11(保护模式:32位x86处理器编程架构+进入保护模式)

news2024/10/6 14:30:08

保护模式:32位x86处理器编程架构

IA-32架构的基本执行环境

  1. 寄存器扩展
    通用寄存器(32):EAX EBX ECX EDX ESI EDI EBP ESP
    指令寄存器(32):EIP
    标志寄存器(32):EFLAGS
    段寄存器–>段选择子(16):CS DS ES SS FS GS(每个段寄存器都有一个64位的描述符高速缓存器)
  2. 线性地址
    在未开启页功能之前,线性地址就是物理地址。当开启页功能后,段部件产生的地址就是线性地址(非物理地址),线性地址还要经过页部件转换后,才是物理地址。

现代处理器的结构和特点

  1. 流水线
    一条指令的执行过程分为取指令、译码和执行三个步骤。
    三层级流水线
    Pentium 4采用NetBrust微结构,使用了31级超深流水线。
  2. 高速缓存
  3. 乱序执行:将指令最小化后,必要时可以乱序执行
  4. 寄存器重命名:使用临时寄存器替代原有指令中的寄存器,提高执行效率。
  5. 分支目标预测:分支目标缓存器BTB,提高分支过程的效率

进入保护模式

全局描述符表

段描述符(8字节)

  • 全局描述符表(GDT):该表是为整个软硬件系统服务的,进- - 入保护模式前必须定义全局描述符表。
  • 全局描述符寄存器(GDTR,48位):包括32位的线性地址和16位的边界地址(数值上等于表的大小,总字节数减一)。
  • 在这里插入图片描述
    GDT最大64KB,从0x00007e00到0x00017dff。
    在这里插入图片描述

安装段描述符并加载GDTR

最初的状态为实模式,因此在GDT中安装描述符必须要将GDT的线性地址转化为逻辑地址和偏移地址。
处理器规定,GDT中的第一个描述符必须是空描述符。将编排好的各个 段写入到对应的内存地址中(0x00007e00开始处)

          ;代码清单11-1
         ;文件名:c11_mbr.asm
         ;文件说明:硬盘主引导扇区代码 
         ;创建日期:2011-5-16 19:54

         ;设置堆栈段和栈指针 
         mov ax,cs      
         mov ss,ax
         mov sp,0x7c00
      
         ;计算GDT所在的逻辑段地址 
         mov ax,[cs:gdt_base+0x7c00]        ;低16位 
         mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位,语法中cs为段地址,后面的三部分为偏移地址,是一个整体,而是不是cs:gdt_base加上0x7c00+0x20
         mov bx,16        
         div bx            
         mov ds,ax                          ;令DS指向该段以进行操作
         mov bx,dx                          ;段内起始偏移地址 
      
         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword [bx+0x00],0x00
         mov dword [bx+0x04],0x00  

         ;创建#1描述符,保护模式下的代码段描述符
         mov dword [bx+0x08],0x7c0001ff     
         mov dword [bx+0x0c],0x00409800     

         ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区) 
         mov dword [bx+0x10],0x8000ffff     
         mov dword [bx+0x14],0x0040920b     

         ;创建#3描述符,保护模式下的堆栈段描述符
         mov dword [bx+0x18],0x00007a00
         mov dword [bx+0x1c],0x00409600

         ;初始化描述符表寄存器GDTR
         mov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一)   
                                             
         lgdt [cs: gdt_size+0x7c00]
      
         in al,0x92                         ;南桥芯片内的端口 
         or al,0000_0010B
         out 0x92,al                        ;打开A20

         cli                                ;保护模式下中断机制尚未建立,应 
                                            ;禁止中断 
         mov eax,cr0
         or eax,1
         mov cr0,eax                        ;设置PE位
      
         ;以下进入保护模式... ...
         jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移
                                            ;清流水线并串行化处理器 
         [bits 32] 

    flush:
         mov cx,00000000000_10_000B         ;加载数据段选择子(0x10)
         mov ds,cx

         ;以下在屏幕上显示"Protect mode OK." 
         mov byte [0x00],'P'  
         mov byte [0x02],'r'
         mov byte [0x04],'o'
         mov byte [0x06],'t'
         mov byte [0x08],'e'
         mov byte [0x0a],'c'
         mov byte [0x0c],'t'
         mov byte [0x0e],' '
         mov byte [0x10],'m'
         mov byte [0x12],'o'
         mov byte [0x14],'d'
         mov byte [0x16],'e'
         mov byte [0x18],' '
         mov byte [0x1a],'O'
         mov byte [0x1c],'K'

         ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 
         mov cx,00000000000_11_000B         ;加载堆栈段选择子
         mov ss,cx
         mov esp,0x7c00

         mov ebp,esp                        ;保存堆栈指针 
         push byte '.'                      ;压入立即数(字节)
         
         sub ebp,4
         cmp ebp,esp                        ;判断压入立即数时,ESP是否减4 
         jnz ghalt                          
         pop eax
         mov [0x1e],al                      ;显示句点 
      
  ghalt:     
         hlt                                ;已经禁止中断,将不会被唤醒 

;-------------------------------------------------------------------------------
     
         gdt_size         dw 0
         gdt_base         dd 0x00007e00     ;GDT的物理地址 
                             
         times 510-($-$$) db 0
                          db 0x55,0xaa

地址线A20

第21根地址线,为了满足原始的8086处理器只有20条地址线,导致的仅为问题。在8086条件下,A20地址线被强制置为0。从南桥芯片端口0x92端口读取数据。

in al, 0x92
or al, 0000_0010B
out 0x92, al

保护模式下的内存访问

控制保护模式开关的是控制寄存器CR0,CR0的0位为PE位(保护模式允许位),CR0是个32位寄存器。保护模式下中断机制尚未建立,应立刻禁止中断。
注意:控制寄存器有9个CR0–CR8

cli

mov eax, cr0
or eax, 1
mov cr0, eax
  • 实模式下访问内存用的是逻辑地址,即段地址乘以16加上偏移地址。
  • 保护模式下段选择器保存的是段选择子(16位),它由三部分组成,分别是描述符的索引号(描述符表中的索引号码),TI位(买哦舒服指示器,为0则描述符在GDT中,为1则描述符在LDT中),RPL(请求特权),使用当前选择子的那个程序的特权级别。
  • GDT的线性基地址在GDTR中,每个描述符占8字节,描述符在表内的偏移地址是索引号乘以8.二者相加则为描述符的线性地址。通过该地址访问GDT中的段描述符,将该描述符加载到不可见的描述符高速缓存部分。
  • 代码段也一样,当CS寄存器放入和合适的代码段选择子,同时CS的非可见部分也加载了对应代码段在GDT中的线性地址,那么每次执行一条代码,EIP中保存的偏移量加上非可见部分的描述符基地址就可以得到下一条指令的线性地址。

避免实模式的历史遗留问题,需要清理流水线

在进入实模式之后,段寄存器的高速换粗部分保留了原始的内容,但其内容是无效的,同时进入后,流水线中的指令并未清除,原来的指令都是16位的译码规则,进入保护模式后需要将其转变为32位的译码模式,因此需要刷新流水线以保证程序运行正常。因此使用jmp远转移指令或者远过程调用指令call,此后会重新加载CS和对应的高速缓存器。32位译码后的指令会有前缀0x66。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PFA试剂瓶本底低PFA取样瓶可采集、储存电子级酸

PFA取样瓶是一种可靠、耐用的用于采集、储存、运输和分析食品、医药、环境和化工等领域样品的容器。相对于传统的取样瓶材料如玻璃或塑料,PFA取样瓶拥有多种优点,使其成为当前许多行业的首选。 首先,PFA取样瓶的材质是聚四氟乙烯共聚物&#…

解读远程工作设计师之未来与发展

引言 在数字化的浪潮下,“远程工作”已经成为现代职场的一个重要趋势。对于设计师来说,这不仅是一种工作方式的转变,更是职业发展的新机遇。在这篇文章中,我将从以下9个方面,深入探讨远程工作设计师的机会、市场和职位…

【Axure RP9】动态面板使用------案例:包括轮播图和多方式登入及左侧菜单栏案例

目录 一 动态面板简介 1.1 动态面板是什么 二 轮播图 2.1 轮播图是什么 2.2 轮播图应用场景 2.3 制作实播图 三 多方式登入 3.1多方式登入是什么 3.3 多方式登入实现 四 左侧菜单栏 4.1左侧菜单栏是什么 4.2 左侧菜单栏实现 一 动态面板简介 1.1 动态面板是什么…

每日好题-A+B problem 高精度的加法和进位计算

C - A B Problem Description 给定两个整数 A,B,计算AB 的值,并计算出现进位的次数。 Input 两个整数 A,B(0≤A,B≤10^10^6)---没错就是10^1000000 Output 两行两个整数表示 AB 的值与出现进位的次数。 Samples Sample #1 Input 15 16 Outp…

OpenHarmony—ArkTS语言入门(构建应用页面)

上一章我们讲到了体验ArkTS,以及应ArkTS语言用页面构成,那么接下来我们接着一起学习以下内容 代码示例 上图便是前文中的页面构成的代码示例,接下来,我将逐一分析各段代码的作用: 1.如上图所示,这类以“”…

惯性导航基础知识学习----01惯性器件相关

🌈武汉大学惯性导航课程合集是入门惯导的精品课程~ 作为导航路上的鼠鼠我,要开始学习惯性导航了~ 需要达到的要求是大致了解惯导的原理等~ 后期会陆续更新惯导相关的知识和笔记等~ 🐬 本blog为 武汉大学惯性导航课程 的记录~ 感谢团队提供的开…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imread’

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imread’ 文章目录 解决:AttributeError: module scipy.misc has no attribute imread背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退(不推荐&#…

PyCharm的环境配置和使用

最近要开发python项目,用到了编辑器PyCharm,这款工具用起来还是很方便的,自带代码提示功能和代码格式化,报错信息提示,调试代码很方便。我用的软件版本是:PyCharm 2021.3.2 (Community Edition)&#xff0c…

S32K一运行IDE挂掉

早上还好好的,到了下午突然间就出问题了,一Debug就挂,整个IDE动不了。 查了这个地址,也没啥问题。查下smartgit看看源代码具体改了什么,发现一大堆配置文件被动了,应该不小心打开这个pe配置,导致…

ElasticSearch详细搭建以及常见错误high disk watermark [ES系列] - 第497篇

导读 历史文章(文章累计490) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六…

日期取值(年月日…)方式

如果不熟悉日期的操作&#xff0c;想要获取相应信息时&#xff0c;可能会写出复杂的 SQL , 比如求日期的月初时间 select hiredate,to_date(to_char(hiredate,yyyy-mm)||-1,yyyy-mm-dd) as 月初 from emp where rownum<3; 其实这个一个函数即可解决&#xff0c;trunc() sele…

SpringBoot上传图片文件到七牛云

准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.27</version></dependency>配置项 七牛云上传必要的配置有&#xff1a;acces…

【Unity动画】综合案例完结-控制角色动作播放+声音配套

这个案例实现的动作并不复杂&#xff0c;主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下&#xff1a; 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…

智能监控平台/视频共享融合系统EasyCVR如何做到不被其他软件强制终止?具体如下

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。国标GB28181流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频…

pinia安装,持久化,统一导出

文章目录 前言Pinia 是什么&#xff1f; 一、Pinia与持久化插件 安装二、使用步骤创建 Store下面是目录结构下面是index.js代码pinia 独立维护仓库 统一导出 下面是modules目录下的user.js代码下面是main.js代码&#xff0c;整个项目只有一个main.js 前言 Pinia 是什么&#x…

如何安装运行Wagtail并结合cpolar内网穿透实现公网访问网站界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS&#xff0c;建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

Python语言学习笔记之十二(FastAPI)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识FastAPI FastApi&#xff0c;一个用于构建API的现代、快速(高性能)的web框架。它使用Python 3.6的类型…

二叉树题目:二叉树着色游戏

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树着色游戏 出处&#xff1a;1145. 二叉树着色游戏 难度 6 级 题目描述 要求 两位玩家参与二叉树着色游戏。给定二叉树的根结点 root \textt…

亿发:数据无缝整合,实时洞察业务——深入分析ERP系统的四大业财一体化优势

"业务财务一体化"是企业数字化的核心议题之一。在业务运作过程中&#xff0c;财务记账能够实现自动、实时化。这也是传统企业资源计划&#xff08;ERP&#xff09;系统的主要价值&#xff0c;实现业务流、信息流和资金流的无缝整合&#xff0c;同时满足企业对业务风险…

深入解析Spring Boot集成MyBatis的多种方式

文章目录 1. 引言2. 传统的XML配置方式2.1 引入依赖2.2 配置数据源和MyBatis2.3 编写Mapper接口和XML映射文件2.4 使用Mapper 3. 注解配置方式3.1 引入依赖3.2 配置数据源和MyBatis3.3 编写Mapper接口3.4 使用Mapper 4. MyBatis动态SQL4.1 使用XML配置方式4.2 使用注解配置方式…