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

保护模式: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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hive学习新天地一站式掌握Hive技能,让你成为大数据领域的佼佼者!

介绍:Hive是一个构建在Hadoop顶层的数据仓库工具,起源于Facebook为了解决海量数据的统计分析需求。它能够将结构化的数据文件映射为一张数据库表,并提供类似于SQL的查询功能,可以将SQL语句转换为MapReduce任务进行运行。 Hive的出…

【企业转型】以企业架构为中心的SABOE数字化转型五环法

01 传统企业数字化转型面临诸多挑战 即将过去的2023年,chatGPT大模型、数据资产入表等事件的发生,标志着数字经济正在加速发展。数字经济是人类社会继农业经济、工业经济之后的第三种经济形态,将推动生产方式、生活方式和治理方式深刻变革&a…

21.Servlet 技术

JavaWeb应用的概念 在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。” Java Web应用中可以包含如下…

教师退休享受国家规定的什么待遇

作为一名教师,一直致力于为学生提供最好的教育服务。然而,随着时间的推移,我们的身体和精力可能会逐渐下降,最终不得不退休。 那么,教师退休后可以享受哪些待遇呢?根据我所了解的情况,以下是一些…

2023本四前端社招面经

美团 全程问项目,根据项目提问,SEO优化方案,还出了一道动态规划的题 SEO优化方案 一、内部优化 META 标签优化:例如:TITLE,KEYWORDS,DESCRIPTION (TDK)等的优化 内部链接…

窗口看门狗和独立看门狗的异同

场景:工业自动化控制器 1. 独立看门狗的应用: 要求: 在一个工业自动化控制器中,需要确保周期性任务能够按时完成。在这个场景中,如果周期性任务在规定的时间内没有完成,可能会导致系统的不稳定。 实现&am…

黑皮诺、白皮诺与灰皮诺各自的特点?

黑皮诺在所有葡萄品种中被誉为的“公主般娇弱的身子却有着皇后的命”,被众多酿酒师认为是最娇弱又最名贵的葡萄品种。云仓酒庄的品牌雷盛红酒LEESON分享这么受欢迎的葡萄品种还有两个同样气质出众的妹妹,分别是灰皮诺和白皮诺。只是姐姐黑皮诺的名气实在…

【Python】人工智能-机器学习——不调库手撕贝叶斯分类问题

1. 作业内容描述 1.1 背景 数据集大小150该数据有4个属性,分别如下 Sepal.Length:花萼长度(cm)Sepal.Width:花萼宽度单位(cm)Petal.Length:花瓣长度(cm)Petal.Width:花瓣宽度(cm)category:类别&#xff0…

GNSS定位中常见的几大坐标系统及其相互转换

目录 一、坐标系概念 二、常见的几大坐标系统 1.ECEF坐标系 2.ENU坐标系 3.LLA坐标系 4.三个坐标系之间的相互转化关系 (1)LLA坐标系转ECEF坐标系 (2)ECEF坐标系转LLA坐标系 (3)ECEF坐标系转ENU坐标系 (4)ENU坐标系转ECEF坐标系 (5)LLA坐标系转ENU坐标系 (6)ENU坐标…

Linux下Netty实现高性能UDP服务

前言 近期笔者基于Netty接收UDP报文进行业务数据统计的功能,因为Netty默认情况下处理UDP收包只能由一个线程负责,无法像TCP协议那种基于主从reactor模型实现多线程监听端口,所以笔者查阅网上资料查看是否有什么方式可以接收UDP收包的性能瓶颈…

Jenkins配置代理节点时遇到的坑和解决办法

需求:服务器太满了,需要找个比较空闲的机器分担一下,看上了同网络的某开会用的笔记本,把这个本本利用起来能跑一个算一个。 但配置起来并不容易,遇到的问题有些网上也几乎找不到答案。这里记录一下能救一个是一个&…

STP原理与配置

为了提高网络可靠性,交换网络中通常会使用冗余链路。然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等问题,进而会影响到用户的通信质量。生成树协议STP(Spanning Tree Protocol&#xff0…

【深度学习目标检测】九、基于yolov5的路标识别(python,目标检测)

YOLOv5是目标检测领域一种非常优秀的模型,其具有以下几个优势: 1. 高精度:YOLOv5相比于其前身YOLOv4,在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进,如更深的网络结构、更多的特征层和更高分辨率的输入图…

VSCode 配置自动生成头文件

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader VSCode 配置自动生成头文件 一、snippets二、配置步骤三、效果展示 一、snippets 相信大家对C、C都头文件都不陌生,都会发现每个头文件都会包括下面的这些格式&…

【PostgreSQL】从零开始:(三)PgAdmin4下载与安装

【PostgreSQL】从零开始:(三)PgAdmin4下载与安装 pgAdmin简介liunx下部署通过yum部署pgAdmin4(6.21)1.安装依赖包2.永久停止防火墙3.配置pgadmin4项目源4.下载并安装pgAdmin45.执行初始化命令6.访问我们的网站 liunx下通过python方…

思码逸企业版 4.0 特性之三:研发效能数据的智能化分析与解读

建立研发效能体系,数据的收集与清理并建立指标体系只是第一步,如果不针对这些指标采集到的数据进行分析,那就无法做到研发效能度量闭环,那么指标体系也就毫无意义。所以研发效能分析在整个研发效能改进闭环中占据非常重要的一环。…

前端开发中的webpack打包工具

前端技术发展迅猛,各种可以提高开发效率的新思想和框架层出不穷,但是它们都有一个共同点,即源代码无法直接运行,必须通过转换后才可以正常运行。webpack是目前主流的打包模块化JavaScript的工具之一。 本章主要涉及的知识点有&am…

算法-动态规划

动态规划算法 应用场景-背包问题 介绍 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题&#xff0…

【运维笔记】mvware centos挂载共享文件夹

安装mvware-tools 这里用的centos安装 yum install open-vm-tools 设置共享文件夹 依次点击:选项-共享文件夹-总是启用-添加,安装添加向导操作添加自己想共享的文件夹后。成功后即可在文件夹栏看到自己共享的文件夹 挂载文件夹 临时挂载 启动虚拟机&…

视频推拉流EasyDSS互联网直播/点播平台构建户外无人机航拍直播解决方案

一、背景分析 近几年,国内无人机市场随着航拍等业务走进大众,出现爆发式增长。无人机除了在民用方面的应用越来越多,在其他领域也已经开始广泛应用,比如公共安全、应急搜救、农林、环保、交通 、通信、气象、影视航拍等。无人机使…