10-11-12 - 实模式到保护模式

news2024/11/20 19:41:21

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 从计算机的历史谈起
  • 2. 绝对的权利带来的问题
  • 3. CPU历史的里程碑 - 8086
    • 3.1 深入解析 [段地址 : 偏移地址]
      • 3.1.1 示例
      • 3.1.2 问题
    • 3.2 8086时期应用程序中的问题
    • 3.3 思考
  • 4. 80286的登场
    • 4.1 80286的兼容性
    • 4.2 初识保护模式
      • 4.2.1 描述符(Descriptor)
      • 4.2.2 描述符表(Descriptor Table)
      • 4.2.3 选择子(Selector)
    • 4.3 进入保护模式的方式
    • 4.4 80286的光荣退场
  • 5. 80386的登场(计算机新时期的标志)
    • 5.1 新时期的内存使用方式
    • 5.2 问题:x86指的究竟是什么处理器?
  • 6. 保护模式
    • 6.1 段属性定义
    • 6.2 选择子属性定义
    • 6.3 保护模式中的段定义
    • 6.4 汇编小贴士
    • 6.5 编程实验
    • 6.6 问题
    • 6.7 一个值得注意的细节
    • 6.8 注意
  • 7. 深入保护模式
    • 7.1 定义显存段
      • 7.1.1 显存的概念和意义
      • 7.1.2 显卡的工作模式:文本模式&图形模式
      • 7.1.3 编程实验:保护模式下的显存操作,打印字符
    • 7.2 小目标
    • 7.3 编程实验:打印字符串
    • 7.4 小结

1. 从计算机的历史谈起

  • 远古时期的程序开发:直接操作物理内存
  • CPU指令的操作数 直接使用 实地址(实际内存地址)
  • 程序员拥有绝对的权利(利用CPU指哪打哪)

2. 绝对的权利带来的问题

  • 难以重定位
    程序每次都需要同样地址的内存执行
  • 给多道程序设计带来障碍
    不管内存多大,但凡一个字节被其他程序占用都无法执行

3. CPU历史的里程碑 - 8086

  • 地址线宽度为20位,可访问1MB内存空间
    (2^20=1M个地址,1个地址存储8bit数据,所以是1MB内存)
  • 引入 [段地址 : 偏移地址](段地址 << 4 + 偏移地址) 的内存访问方式
    • 8086的段寄存器和通用寄存器为16位
    • 单个寄存器寻址最多访问64KB的内存空间
    • 需要两个寄存器配合,完成所有内存空间的访问

3.1 深入解析 [段地址 : 偏移地址]

  • 硬件所做的工作
    • 段地址左移4位,构成20位的基地址(起始地址)
    • [段地址 : 偏移地址]
      = 段地址 << 4 + 偏移地址
      = 基地址 + 偏移地址 = 实地址
  • 对于开发者的意义
    • 更有效的划分内存的功能(数据段、代码段、等)
    • 当出现程序地址冲突时,通过修改段地址解决冲突

3.1.1 示例

mov ax, [0x1234]
==> 实地址:( ds << 4 ) + 0x1234
mov ax, [es:0x1234]
==> 实地址:( es << 4 ) + 0x1234

3.1.2 问题

  • [段地址 : 偏移地址] 能访问的最大地址为 0xFFFF:0xFFFF,即10FFEF;超过了1MB的空间,CPU如何处理?
  • 8086 的高端地址区(High Memory Area)
    • [ FFFF : FFFF ]
      ⇒ 0xFFFF0 + 0xFFFF
      ⇒ 0xFFFF0 + ( 0xF + 0xFFF0 )
      ⇒ ( 0xFFFF0 + 0xF ) + 0xFFF0
      ⇒ ( 0xFFFFF ) + 0xFFF0 = 0x10FFEF
      0xFFF0,即 HMA:[ 0x100000, 0x10FFEF ]
  • 8086 的处理方式
    • 由于8086只有20位地址线,因此最高位被丢弃(溢出)
    • 0xFFFF : 0xFFFF ⇒ 0x10FFEF
    • 1 0000 1111 1111 1110 1111 ==> 回卷 ==> 0xFFEF

3.2 8086时期应用程序中的问题

  • 1MB 内存完全不够用(内存在任何时期都不够用)
  • 开发者在程序中大量使用 内存回卷技术(HMA地址被使用)
  • 应用程序之间没有界限,相互之间随意干扰
    • A程序可以随意访问B程序中的数据
    • C程序可以修改系统调度程序的指令

3.3 思考

  • 8086程序中问题的本质是什么?如何解决?

4. 80286的登场

  • 8086已经有那么多应用程序了,所以必须要兼容再兼容
  • 加大内存容量,增加地址线数量(24位,16MB)
  • [段地址 : 偏移地址] 的方式可以强化一下
    • 为每个段提供更多属性(如:范围、特权级、等)
    • 为每个段的定义提供固定方式

4.1 80286的兼容性

  • 默认情况下完全兼容8086的运行方式(实模式)
    • 默认可直接访问1MB的内存空间
    • 通过特殊的方式访问1MB+的内存空间
  • 这个特殊的方式指的是什么?
    • 处理器需要特定的设置步骤才能进入保护模式,默认为实模式。
    • 80286之后的工作模式:
实模式保护模式
兼容8086的工作模式新的工作模式
实地址 =( 段寄存器 << 4 )+ 偏移地址内存地址 = 段起始地址 + 偏移地址
任意内存随意访问每个段增加各种属性描述,保证安全性

4.2 初识保护模式

  • 每一段的内存拥有一个属性定义(描述符 Descriptor
  • 所有段的属性定义构成一张表(描述符表 Descriptor Table
  • 段寄存器保存的是属性定义在表中的索引(选择子 Selector

4.2.1 描述符(Descriptor)

在这里插入图片描述

  • 段基址:段的起始地址(这段从哪开始)
  • 段界限:段内偏移地址的最大值(这个段有多大)
  • 段属性:-

4.2.2 描述符表(Descriptor Table)

在这里插入图片描述

  • 存在一个特殊的寄存器存放描述符表的地址。

4.2.3 选择子(Selector)

  • 段寄存器中保存的再也不是段基址了,里面保存的内容叫做 选择子

    简单来说:选择子就是段描述符在段描述符表中的索引下标。把全局描述符表当成数组,选择子就像数组下标一样。

    在这里插入图片描述

  • 说明:

    • RPL:请求者特权级标识,通过 特权级 判断是否可以访问对应段
    • TI:表示当前选择子所属的描述符表
      • 0 代表 GDT(全局段描述符表)
      • 1 代表 LDT(局部段描述符表)

4.3 进入保护模式的方式

  1. 定义描述符表
  2. 打开A20地址线
  3. 加载描述符表
  4. 通知CPU进入保护模式

4.4 80286的光荣退场

  • 历史意义
    • 引入了保护模式,为现代操作系统和应用程序奠定了基础
  • 奇葩设计
    • 段寄存器为24位,通用寄存器为16位(不伦不类)
      • 理论上,段寄存器中的数值可以直接作为段基址
      • 16位通用寄存器最多访问64K的内存
      • 为了访问16M的内存,必须不停切换段基址

5. 80386的登场(计算机新时期的标志)

  • 32位 地址总线(可支持4G的内存空间)
  • 段寄存器和通用寄存器都为32位
    • 任何一个寄存器都能访问到内存的任意角落
      • 开启了 平坦内存模式 的新时代
      • 段基址为0,使用通用寄存器访问4G内存空间

5.1 新时期的内存使用方式

  • 实模式
    • 兼容8086的内存使用方式
  • 分段模式
    • 通过 [段地址 : 偏移地址] 的方式将内存从功能上分段(数据段、代码段)
  • 平坦模式
    • 所有内存就是一个段 [0 : 32位偏移地址]

5.2 问题:x86指的究竟是什么处理器?

  • 8086第1代
  • 80286第2代
  • 80386第3代

6. 保护模式

6.1 段属性定义

标识符意义
DA_320x4000保护模式下32位段
DA_DR0x90只读数据段
DA_DRW0x92可读写数据段
DA_DRWA0x93已访问可读写数据段
DA_C0x98只执行代码段
DA_CR0x9A可执行可读代码段
DA_CCO0x9C只执行一致代码段
DA_CCOR0x9E可执行可读一致代码段

6.2 选择子属性定义

段描述符表中的第几项。

在这里插入图片描述

注:

  • RPL:请求者特权级标识,通过 特权级 判断是否可以访问对应段
  • 这里的TI取值为0、1,因为是第2位,所以为1时得到图中的4。

6.3 保护模式中的段定义

注:宏定义的语法

%macro   macro_name    number_of_params 
<macro body> 
%endmacro

在这里插入图片描述

6.4 汇编小贴士

  • section关键字用于 “逻辑的” 定义一段代码集合
  • section定义的代码段不同于 [段地址 : 偏移地址] 代码段
    • section定义的代码段 仅限于源码(文本形式)中的代码段(代码节)
    • [ 段地址 : 偏移地址 ] 的代码段指 内存中的代码段(源码经编译并加载到内存中执行)

在这里插入图片描述

  • [bits 16]
    用于表示编译器将代码按照16位方式进行编译

  • [bits 32]
    用于指示编译器将代码按照32位方式进行编译

  • 注意事项:

    • 段描述符表中的第0个描述符不使用(仅用于占位)
    • 代码中必须 显式的 指明16位代码段和32位代码段
    • 必须使用 jmp指令 从16位代码段跳转到32位代码段

6.5 编程实验

  • 需要在16位实模式中对GDT中的数据进行初始化
  • 代码中需要为GDT定义一个标识数据结构(GdtPtr)
  • 需要使用jmp指令从16位代码跳转到32位代码

【参看链接】:10-11-12 - 实模式到保护模式 / 11

反编译loader:ndisasm -o 0x9000 loader > loader.txt
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.6 问题

  • 为什么不直接使用标签定义描述符中的段基地址?
  • 为什么16位代码段到32位代码段必须无条件跳转?
  • 需要掌握的重点:
    • NASM将汇编文件当成一个 独立的代码段 编译
    • 汇编代码中的 标签(Label) 代表的是 段内偏移地址
    • 实模式下需要配合段寄存器中的值计算标签的物理地址
  • 流水线技术:
    1. 处理器为了提高效率将当前指令和后续指令预取到流水线
    2. 因此,可能同时预取的指令中既有16位代码又有32位代码
    3. 为了避免将32位代码用16位的方式运行,需要刷新流水线
    4. 无条件跳转jmp能 强制刷新流水线

6.7 一个值得注意的细节

	...
	; 4. enter protect mode
	mov  eax, cr0
	or eax, 0x01
	mov cr0, eax
	; 5. jump to 32 bits code
	jmp dword Code32Selector : 0

[section .s32]
[bits 32]
CODE32_SEGMENT:
    mov eax, 0
    jmp CODE32_SEGMENT
	...

jmp dword Code32Selector : 0 ==> 为什么需要dword?

  • 不一般的 jmp(s16 ==> s32)
    • 在16位代码中,所有的立即数默认为16位
    • 从16位代码段跳转到32位代码段时,必须做强制转换;否则,段内偏移地址可能被截断
      在这里插入图片描述

6.8 注意

在这里插入图片描述

7. 深入保护模式

7.1 定义显存段

  • 为了显示数据,必须存在两大硬件:显卡 + 显示器
    • 显卡:为显示器提供需要显示的数据,控制显示器的模式和状态
    • 显示器:将目标数据以可见的方式呈现在屏幕上

7.1.1 显存的概念和意义

  • 显卡拥有自己内部的数据存储器,简称 显存
    • 显存在本质上和普通内存无差别,用于存储目标数据
    • 操作显存中的数据将导致显示器上的内容改变

7.1.2 显卡的工作模式:文本模式&图形模式

  • 在不同的模式下,显卡对显存内容的解释是不同的

  • 可以使用专属指令或 int 0x10 中断改变显卡工作模式

    • 在文本模式下:(这里只介绍文本模式)
      • 显存的地址范围映射为:[ 0xB8000, 0xBFFFF ]
      • 一屏幕可以显示25行,每行80个字符(25 * 80)
      • 显卡的文本模式原理:
        在这里插入图片描述
  • 文本模式下显示字符:

在这里插入图片描述
在这里插入图片描述

注:fs、gs是80386起增加的两个辅助段寄存器,在这之前只有一个辅助段寄存器ES,增加这两个寄存器是为了减轻ES寄存器的负担,并能更好地配合适用于通用寄存器组的基址和变址寄存器。这两个是通用的段寄存器,语法上同其它的段寄存器一样,不能直接用立即数给它赋值。
  FS、GS 是从 80386 开始增加的,没有全称,取名就是按字母序排在 CS、DS、ES 之后的。而 CS、DS、ES、SS 是有全称的:CS (Code Segment) 代码段、DS (Data Segment) 数据段、ES (Extra Segment) 附加段、SS (Stack Segment) 栈段。

7.1.3 编程实验:保护模式下的显存操作,打印字符

【参看链接】:10-11-12 - 实模式到保护模式 / 12 / 00

在这里插入图片描述

7.2 小目标

  1. 在保护模式下,打印指定内存中的字符串
    • 定义全局堆栈段(.gs),用于保护模式下的函数调用
    • 定义全局数据段(.data),用于定义只读数据段(D.T.OS!)
    • 利用显存段的操作定义字符串打印函数(PrintString)
  2. 打印函数(PrintString)的设计
    在这里插入图片描述

7.3 编程实验:打印字符串

【参看链接】:10-11-12 - 实模式到保护模式 / 12 / 01

在这里插入图片描述

data.img插入到vmware中运行结果如下:

在这里插入图片描述

7.4 小结

  • 实模式下可以使用32位寄存器和32位地址
  • 显存是显卡内部的存储单元,本质上与普通内存无差别
  • 显卡有两种工作模式:文本模式&图形模式
  • 文本模式下操作显存单元中的数据能够立即反映到显示器

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

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

相关文章

JDBC连接数据库详解~

课前导读&#xff1a; 本文章有关JDBC连接数据库的操作&#xff0c;其中涉及了编译器idea的使用&#xff0c;其中连接的数据库为MySQL数据库&#xff0c;通过博主自己的学习和总结写出了下面的文章。 目录 课前导读&#xff1a; 一、JDBC简介 二、JDBC连接操作 三、源码提供…

数素数

目录 1013 数素数 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 代码长度限制: 时间限制: 内存限制: 思路: 1.判断素数 1.2素数判断代码: 2.数组存素数 2.2存素数代码: 3.输出Pm到Pn的全部素数 3.2代码 总代码: 总结: 题目…

Web大学生网页作业成品 bootstrap响应式网站开发 基于HTML+CSS+JS+Bootstrap制作火锅美食网站(4页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.3 实时操作系统 1.4.4 通用操作系统 1.4.5 单用户操作系统

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.4 操作系统的分类1.4.3 实时操作系统1.4.4 通用操作系统1.4.5 单用户操作系统第1章 操作系统概述 1.4 操作系统的分类 1.4.3 实时操作系统 所谓实时&#xff0c;是指系统能够对外部请求做…

R语言多重比较方法

假设检验的基本原理是小概率原理&#xff0c;即我们认为小概率事件在一次试验中实际上不可能发生。 多重比较的问题 当同一研究问题下进行多次假设检验时&#xff0c;不再符合小概率原理所说的“一次试验”。如果在该研究问题下只要有检验是阳性的&#xff0c;就对该问题下阳性…

c#入门-静态引用,扩展方法

静态引用 声明静态引用 引用命名空间时&#xff0c;可以在using后面加static修饰符。 然后把要引用的命名空间改为带命名空间的一个具体的类。 这称为静态引用。 using static System.Int32; using static System.Console; int a Parse(ReadLine());静态引用的效果 静态引…

VRC改模从入门到入门

第一步入门 从unity开始 bilibili超细心的unity入门教程 虽然视频很长&#xff0c;但是从p1看到p41就行&#xff0c;脚本部分完全不需要看&#xff0c;因为vrc上传会过滤掉不是他们的脚本的。 unity下载一定要下载2019.4.31f1版本&#xff0c;哔哩哔哩教程有下载unity对应版本…

基于Android的外卖App系统设计

基于Android的外卖App系统设计 摘要 随着智能手机的快速普及&#xff0c;智能手机操作系统市场风生水起。为了让智能手机用户能够随时随地查询互联网所提供的服务&#xff0c;一种高效的办法就是将应用系统的功能拓展到手机终端上&#xff0c;让手机能够通过移动网以及互联网…

CentOS 安装 mysql 8.0

目录 下载 安装步骤 上传 解压安装 参考资料 补充报错解决 下载 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 安装步骤 上传 使用xshell&#xff0c;连接服务器&#xff0c;用 rz命令接收下载的文件&#xff08;该命令使用 yum…

Linux 文件属性

Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。 为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 在 Linux 中我们通常使用以下两个命…

LeetCode Hot 100~Day1

目录 两数之和 两数相加 无重复字符的最长子串 最长回文子串 盛最多水的容器 删除链表的倒数第n个节点 合并两个有序链表 有效的括号 两数之和 题目链接&#xff1a;1.两数之和 示例 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[0,1] 解释…

ADI Blackfin DSP处理器-BF533的开发详解33:数字信号处理详解-FFT(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 FFT&#xff08;Fast Fourier Transformation&#xff09;&#xff0c;即为快速傅氏变换&#xff0c;是离散傅氏变换的快速算法&#x…

web前端期末大作业:JavaScript大作业——福五鼠动漫网页制作(6页)带轮播图效果 学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

R语言大数据分析纽约市的311万条投诉统计可视化与时间序列分析

介绍 本文并不表示R在数据分析方面比Python更好或更快速&#xff0c;我本人每天都使用两种语言。这篇文章只是提供了比较这两种语言的机会。 本文中的 数据 每天都会更新&#xff0c;我的文件版本更大&#xff0c;为4.63 GB。 CSV文件包含纽约市的311条投诉。它是纽约市开放…

MySQL 数据库 C/C++ 常用函数

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

火爆出圈的OpenAI模型ChatGPT体验

1、ChatGPT简要介绍 ChatGPT是一种高效的语言模型&#xff0c;全称为"聊天式自动回复生成技术"&#xff08;Chat-based Automatic Reply Generation Technology&#xff09;&#xff0c;用于预测人类语言的后续内容。它是基于OpenAI的GPT-3模型构建的&#xff0c;具…

XCIE-HUAWEI-超级完整的BGP-1

XCIE-HUAWEI-超级完整的BGP-1 声明&#xff0c;内容对比前面的可能差一点&#xff0c;因为这个BGP我是会的&#xff0c;但是华为的特性啥的不太会 所以相对来说可能没那么详细&#xff0c;不过应该也够的了&#xff0c;要看思科的翻我的文章去有思科的 先说一个东西 面试会问…

S7-200SMART实现MODBUS TCP通信(客户端+服务器)的具体方法和步骤示例

S7-200SMART实现MODBUS TCP通信(客户端+服务器)的具体方法和步骤示例 STEP7-Micro/WIN SMART 从V2.4 版本开始,软件中直接集成 Modbus TCP 库指令,安装软件后,Modbus TCP 指令位于 STEP7-Micro/WIN SMART 项目树中“指令”文件夹的“库”文件夹中。 如下图Modbus TCP库指令…

R语言曲线回归:多项式回归、多项式样条回归、非线性回归数据分析

最近我们被客户要求撰写关于曲线回归的研究报告&#xff0c;包括一些图形和统计输出。本文将使用三种方法使模型适合曲线数据&#xff1a;1&#xff09;多项式回归&#xff1b;2&#xff09;用多项式样条进行B样条回归&#xff1b;3&#xff09; 进行非线性回归。在此示例中&am…

微信小程序 | 一比一复刻世界杯点球大战

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏&#xff01;从个人到商业的全套开发教程&#xff0c;实打实的干货分享&#xff0c;确定不来看看&#xff1f; …