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,axmov sp,0x7c00;计算GDT所在的逻辑段地址 mov ax,[cs:gdt_base+0x7c00]        ;低16位 mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位,语法中cs为段地址,后面的三部分为偏移地址,是一个整体,而是不是cs:gdt_base加上0x7c00+0x20mov bx,16        div bx            mov ds,ax                          ;令DS指向该段以进行操作mov bx,dx                          ;段内起始偏移地址 ;创建0#描述符,它是空描述符,这是处理器的要求mov dword [bx+0x00],0x00mov 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],0x00007a00mov dword [bx+0x1c],0x00409600;初始化描述符表寄存器GDTRmov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一)   lgdt [cs: gdt_size+0x7c00]in al,0x92                         ;南桥芯片内的端口 or al,0000_0010Bout 0x92,al                        ;打开A20cli                                ;保护模式下中断机制尚未建立,应 ;禁止中断 mov eax,cr0or eax,1mov 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,cxmov esp,0x7c00mov ebp,esp                        ;保存堆栈指针 push byte '.'                      ;压入立即数(字节)sub ebp,4cmp ebp,esp                        ;判断压入立即数时,ESP是否减4 jnz ghalt                          pop eaxmov [0x1e],al                      ;显示句点 ghalt:     hlt                                ;已经禁止中断,将不会被唤醒 ;-------------------------------------------------------------------------------gdt_size         dw 0gdt_base         dd 0x00007e00     ;GDT的物理地址 times 510-($-$$) db 0db 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

climov 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.hqwc.cn/news/277189.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器的转换原理--ENSP实验

目录 一、路由器的工作原理 二、路由表的形成 1、直连路由 2、非直连路由 2.1静态路由 2.2动态路由 三、静态路由和默认路由 1、静态路由 1.1静态路由的缺点 1.2路由的配置--结合ensp实验 2、默认路由--特殊的静态路由 2.1概念 2.2格式 2.3默认路由的配置--ens…

如何在 JavaScript 中实现任务队列

任务队列的概念 任务队列就是存放任务的队列,队列中的任务都严格按照进入队列的先后顺序执行。 在前一条任务执行完毕后,立即执行下一条任务,直到任务队列清空。 任务队列的基本执行流程如下: 设置任务队列并发数; …

VMP泄露编译的一些注意事项

VMP编译教程 鉴于VMP已经在GitHub上被大佬强制开源,特此出一期编译教程。各位熟悉的可以略过,不熟悉的可以参考一下。 环境(软件) Visual Studio 2015 - 2022 (建议使用VS2019,Qt插件只有这个版本及以上…

【改进YOLOv8】生猪胖瘦评价分级系统:可重参化EfficientRepBiPAN优化Neck

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 随着计算机视觉和深度学习的快速发展,目标检测成为了计算机视觉领域的一个重要研究方向。目标检测的目标是在图像或视频中准确地识别和定…

如何购买最新卫星影像?

虽然该网站提供的卫星影像更新频率快,且覆盖率高,但分辨率却只有10米。 如果工作中需要用到最新的卫星影像,且分辨率要求高,也许付费购买才是解决问题的最佳途径。 卫星影像主要分光学卫星影像和SAR影像两种,由于我们…

C++ stringOJ练习题

目录 把字符串转换成整数 反转字符串 字符串中的第一个唯一字符 字符串最后一个单词的长度 找出字符串中第一个只出现一次的字符 字符串相加 字符串最后一个单词长度 字符串相乘 反转字符串3 反转字符串2 验证回文串 把字符串转换成整数 通过遍历字符串并逐位转换…

Day09 Liunx高级系统设计11-数据库1

MySQL 简介 数据库DB 数据库( DataBase , DB )从本质上讲就是一个文件系统,它能够将数据有组织地集合在一起,按照一定的规则长期存储到计算机的磁盘中,并且能够供多个用户共享和使用,同时&…

ida脚本环境开发配置idapythonidacpp三端环境(win,mac,linux)

ida脚本也有一段时间了,一直有个痛点是找不到比较好的方法热重载脚本来实时改动生效,导致开发效率老慢了。固总结下比较友好的环境搭配 使用ida热加载插件让你开发脚本更高效 github地址: GitHub - 0xeb/ida-qscripts: An IDA plugin to increase productivity when developi…

微信小程序自定义组件---父子组件通信

有三种方式 属性绑定 父组件 子组件 事件绑定 步骤1:定义一个自定义事件 步骤2:bind:sync"自定义事件名称" 步骤3:this.triggerEvent(事件名,{参数}) 步骤4:通过e.detail.value获取子组件传递过来的数据 …

Dockerfile创建镜像LNMP+WordPress

目录 实验部署 nginx 配置mysql 配置php 实验部署 INMPwordpress nginx 172.111.0.10 docker-nginx mysql 172.111.0.20 docker-mysql php 172.111.0.30 docker-php nginx 关闭防火墙和安全机制在opt目录创建nginx MySQL php目录 cd nginx mysql php vim Dockerfile#声…

袋鼠目标检测数据集VOC+YOLO格式1400多张

袋鼠是双门齿目袋鼠亚目袋鼠科大袋鼠属的哺乳动物。袋鼠跳得最高、最远。雌性袋鼠都长有一个前开的育儿袋,袋鼠也因此得名。 [8]袋鼠泛指任一种属于袋鼠目的有袋动物, [7]它头小眼大耳朵长,面部较长,鼻孔两侧有黑色须痕。袋鼠胆小…

电阻的运用

本文引注 https://baijiahao.baidu.com/s?id1749115196647029942&wfrspider&forpc 一、零欧电阻 在电子电路设计时经常用到的一种元件就是电阻,我们都知道电阻在电路中起到分压限流的作用。然而,实际使用时会用到一种特殊的电阻:零…