保护模式

简介: 保护模式

从实模式到保护模式

  • 关于实模式和保护模式,要从历史谈起
  • 实模式可以理解为直接操作物理内存的模式
  • 初始时期的程序开发是直接操作物理内存的
  • CPU 指令的操作数直接使用实地址(实际内存地址)
  • 程序员拥有绝对的权利(利用 CPU 指哪打哪),这么做带来的问题
  • 难以重定位,程序每次都需要同样地址的内存执行
  • 给多道程序的设计带来了障碍,不同程序之间使用的内存绝对不能有重叠

CPU 历史的里程碑 - 8086

  • 地址位宽为 20 位,可以访问 1M 内存空间
  • 引入 [段地址:偏移地址] 的内存访问方式
  • 8086 的段寄存器和通用寄存器为 16 位
  • 单个寄存器最多访问 64K 的内存空间
  • 需要两个寄存器的配合,完成所有内存空间的访问
  • 更多内容见 【8086汇编基础】
  • 一个问题:[段地址:偏移地址] 能访问的最大地址为:0xFFFF:0xFFFF,即:10FFFF,那么,超过 1M 的空间,CPU 如何处理?
  • 由于 8086 只有 20 位地址线,因此,高位被丢弃(溢出)
  • 8086 中的高端地址区(High Memory Area)
0xFFFF:0xFFFF
  0xFFFF0 + 0xFFFF
    0xFFFF0 + (0xF + 0xFFF0)
      (0xFFFF0 + 0xF) + 0xFFF0
  • 8086地址线宽度是20,最多可以访问 1M 的内存空间。 而 (0xFFFF0 + 0xF) 正好2(20) = 1M ,已经就是8086处理器可以访问到的最大地址值了。此时多出来的 0xFFF0 是 8086 中的 无效地址范围,又
• 叫 高端内存区(HMA)。例如 0xFFFF:0xFFFF 实际访问的地址是 0xFFEF。
0xFFFF:0xFFFF
    |
100001111111111101111
    |
00001111111111101111 // 回卷,只保留低 20 位,高位被丢弃
    |
0xFFEF
  • 8086 时期应用程序的问题
  • 1M 内存完全不够用
  • 开发者在程序中大量使用回卷技术(HMA 地址被使用)
  • 应用程序之间没有界限,相互之间随意干扰,程序指哪打哪,内存任意地方都能修改

80286 登场

  • 8086 已经有那么多应用程序了,所以必须兼容
  • 加大内存容量,增加地址线数量(24 位)
  • [段地址:偏移地址]的方式可以强化一下
  • 为每一个段提供更多属性(如:范围,特权级等)
  • 为每个段的定义提供固定方式
  • 80286 的兼容性
  • 默认情况下完全兼容 8086 的运行模式(实模式)
  • 通过特殊的方式访问 1MB+ 的内存空间

初识保护模式

  • 这个特殊的方式指的是什么?
  • 80286 之后的工作模式 - 保护模式
实模式 保护模式
兼容 8086 的工作模式 新的工作模式
实地址 = (段寄存器 << 4) + 偏移地址 内存地址 = 段起始地址 + 偏移地址
任意内存随意访问 每个段增加各种属性,保证安全性
  • 保护模式为每个段增加各种属性,于是引出段描述符、段描述符表、段选择符三个概念

段描述符

  • 每一段内存拥有一个属性定义(段描述符 Descriptor)
  • 段描述符是 GDT 和 LDT 中的一个数据结构项,用于向处理器提供有关一个段的位置、大小以及访问控制的状态信息。每个段描述符的长度是 8 个字节,含有 3 个主要字段:
  • 段基地址
  • 段限长
  • 段属性
  • 段描述符分数据段、代码段以及系统段三种
  • 下图是段描述符通用格式

  • 有个疑问?为啥基地址,段限长要分成多个部分,而不是连续排列呢?这个只能说是历史原因,硬件决定,软件不能更改。

段限长字段 LIMIT(Segment limit)

  • 用于指定段的长度。处理器会把段描述符中两个段限长字段组合成一个 20 位的值,并根据颗粒度标志 G 来指定段限长 Limit 值的实际含义。
  • 如果 G=0,则 Limit 值的单位是 B,也就是说 Limit 的范围可以是 1B 到 1MB;
  • 如果 G=1,则 Limit 值的单位是 4KB,也就是说 Limit 的范围可以是 4KB 到 4GB。
  • 根据段类型字段 TYPE 中的段扩展方向标志 E,处理器可以以两种不同的方式使用 Limit。
  • E=0:表示向上扩展的段(简称上扩段),逻辑地址中的偏移值范围可以从 0 到 Limit;
  • E=1:表示向下扩展的段(简称下扩段),逻辑地址中的偏移范围可以从 Limit 到 0xFFFF(当 B=0 时)或者 0xFFFFFFFF(当 B=1 时)。关于B位,后面将解释。

基地址字段 BASE(Base address)

  • 该字段定义在 4GB 线性地址空间中一个段的字节 0 所处的位置(段起始位置)。
  • 段基地址可以是 0~4GB 范围内的任意地址(这同实模式不同,实模式下段基地址要求 16 字节对齐),但是,为了让程序具有最佳性能,还是建议段基地址对齐 16 字节边界。

段类型字段 TYPE

  • 该字段用于指定段或者门(Gate)的类型、说明段的访问种类以及段的扩展方向。该字段的解释依赖于描述符类型标志 S;TYPE 字段的编码对代码段、数据段或者系统描述符都不同。
代码和数据段描述符类型
  • 当段描述符中 S(描述符类型)标志为 1 时,则该描述符用于代码或数据段

系统描述符类型
  • 当段描述符中的 S 标志(描述符类型)为 0 时,则该描述符是一个系统描述符。处理器能够识别以下一些类型的系统段描述符:
  • 局部描述符表(LDT)的段描述符
  • 任务状态段(TSS)描述符
  • 调用门描述符
  • 中断门描述符
  • 陷阱门描述符
  • 任务门描述符
  • 这些描述符类型可分为两大类:系统段描述符和门描述符。系统段描述符指向系统段(如 LDT 和 TSS 段),门描述符就是一个“门”,对于调用、中断或陷阱门,其中含有代码段的选择符和段中程序入口点的指针;对于任务门,其中含有 TSS 的段选择符。下图给出了系统段描述符和门描述符类型字段的编码。

描述符类型标志 S(Descriptor type flag)

  • 描述符类型标志 S 指明一个段描述符是系统段描述符(当 S=0)还是代码或数据段描述符(当 S=1)

描述符特权级字段 DPL(Descriptor privilege level)

  • DPL 字段指明描述符的特权级。特权级范围从 0 到 3。0 级特权级最高,3 级最低。DPL 用于控制对段的访问

段存在标志 P(Segment present)

  • 用于指出一个段是在内存中(P=1)还是不在内存中(P=0)
  • 当一个段描述符的 P 标志为 0 时,那么把指向这个段描述符的选择符加载进段寄存器将导致产生一个段不存在异常。内存管理软件可以使用这个标志来控制在某一给定时间实际需要把那个段加载进内存中。这个功能为虚拟存储提供了除分页机制以外的控制。

D/B(默认操作大小/默认栈指针大小和/或上界限)标志

  • D/B 位对不同的段有不同的影响
  • 对数据段(CS)的影响:
  • D = 1,采用 32 位寻址方式
  • D = 0,采用 16 位寻址方式
  • 对栈段(SS)的影响:
  • D = 1,隐式对栈访问指令(会修改 ESP,如:PUSH、POP、CALL)使用 32 位堆栈指针寄存器 ESP
  • D = 0,隐式对栈访问指令(会修改 SP,如:PUSH、POP、CALL)使用 16 位堆栈指针寄存器 SP
  • 对向下扩展的数据段的影响:
  • D = 1,段上限为 4GB
  • D = 0,段上限为 64KB

颗粒度标志 G(Granularity)

  • 该字段用于确定段限长字段 Limit 值的单位。
  • 如果 G=0,则 Limit 值的单位是 B;
  • 如果 G=1,则 Limit 值的单位是 4KB;
  • 注意:这个字段不影响段基地址的颗粒度,基地址的颗粒度总是以字节为单位。

数据段、代码段、系统段描述符

  • 段描述符分为数据段、代码段以及系统段三种描述符,它们之间的差异如下图所示

段描述符表(Descriptor Table)

  • 什么是段描述符表?通俗的讲就是由多个段描述符组成的一个数组
  • 一个段描述符就占用 8 个字节,更别说整个段描述符表了,CPU 的寄存器肯定是放不下的,所以段描述符表是处于内存中。我们使用一个特殊寄存器来指向它,这样子我们就可以通过这个特殊寄存器来使用描述符表啦

段选择符

  • 我们在操作数组的时候需要两个要素,一个是数组首地址(数组名),另一个就是数组下标,段描述符表可以看作一个数组,段选择符就可以看作是这个数组下标,当然,它不仅仅是数组下标这么简单
  • 段选择符(或称段选择子)是段的一个 16 位标识符。段选择符并不直接指向段,而是指向段描述符表中定义段的段描述符。

  • 段选择符 3 个字段内容:
  • 请求特权级 RPL(Requested Privilege Level):请求者特权级标志,通过特权级标志判断是否可以访问对应段
  • 表指示标志 TI(Table Index):TI=0 表示描述符在 GDT 中;TI=1 表示描述符在 LDT 中
  • 索引值(Index):索引字段给出了描述符在 GDT 或 LDT 表中的索引项号

进入保护模式的方式

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

小结

  • [段地址:偏移地址] 的寻址方式解决了早期程序定位难得问题
  • 8086 实模式下的程序无法保证安全性
  • 80286 中提出了保护模式,加强了内存的安全性
  • 出于兼容性的考虑,80286 之后的处理器都有 2 中工作模式
  • 处理器需要特定的步骤才能进入保护模式,默认为实模式

80286 的光荣退场

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

80386 的登场

  • 80286 这款处理器属于个试水产品,所以很快就退出了历史舞台
  • 计算机新时期的标志 - 80386
  • 32 位地址总线(可支持 4G 的内存空间)
  • 段寄存器和通用寄存器都为 32 位。任意一个寄存器都能访问到内存的任意角落,这就相当于 4G 的内存空间可以看成一个段,段基址为 0, 使用通用寄存器可以访问整个 4G 内存空间 这就是所谓的平坦模式。

新时期的内存使用方式

  • 实模式:兼容 8086 的内存使用方式(指哪打哪)
  • 分段模式:通过 [段基址:偏移地址] 的方式将内存从功能上分段(数据段,代码段)
  • 平坦模式:所有内存就是一个段 [0:32 位偏移地址]
目录
相关文章
|
消息中间件 监控 数据挖掘
NineData:从Kafka到ClickHouse的数据同步解决方案
NineData 提供了强大的数据转换和映射功能,以解决 Kafka 和 ClickHouse 之间的格式和结构差异,确保数据在同步过程中的一致性和准确性。
681 2
NineData:从Kafka到ClickHouse的数据同步解决方案
|
关系型数据库 MySQL PHP
LAMP架构及搭建LAMP+Discuz论坛
LAMP架构及搭建LAMP+Discuz论坛
584 0
|
10月前
|
数据安全/隐私保护
OAuth2.0实战案例
OAuth2.0实战案例
250 0
OAuth2.0实战案例
|
11月前
|
Java
IDEA的fxml打开Scene Builder后空白! Scene Builder下载依赖后还是空白不显示 无论如何都不显示,网上的教程试过来了遍还是不显示
本文提供了三种方法来解决IDEA中fxml文件在Scene Builder中打开后显示空白的问题:检查JavaFX是否安装、切换IDEA版本、下载Scene Builder插件。
782 1
|
10月前
|
安全 API 网络架构
Python中哪个框架最适合做API?
本文介绍了Python生态系统中几个流行的API框架,包括Flask、FastAPI、Django Rest Framework(DRF)、Falcon和Tornado。每个框架都有其独特的优势和适用场景。Flask轻量灵活,适合小型项目;FastAPI高性能且自动生成文档,适合需要高吞吐量的API;DRF功能强大,适合复杂应用;Falcon高性能低延迟,适合快速API开发;Tornado异步非阻塞,适合高并发场景。文章通过示例代码和优缺点分析,帮助开发者根据项目需求选择合适的框架。
1836 0
|
人工智能 文字识别 自然语言处理
Nougat:一种用于科学文档OCR的Transformer 模型
随着人工智能领域的不断进步,其子领域,包括自然语言处理,自然语言生成,计算机视觉等,由于其广泛的用例而迅速获得了大量的普及。光学字符识别(OCR)是计算机视觉中一个成熟且被广泛研究的领域。它有许多用途,如文档数字化、手写识别和场景文本识别。数学表达式的识别是OCR在学术研究中受到广泛关注的一个领域。
490 0
|
安全 区块链 数据安全/隐私保护
《区块链公链数据分析简易速速上手小册》第1章:区块链基础(2024 最新版)
《区块链公链数据分析简易速速上手小册》第1章:区块链基础(2024 最新版)
268 0
|
机器学习/深度学习 编解码 达摩院
【OpenVI-图像超分实战篇】别用GAN做超分了,快来试试基于扩散模型的图像超分吧!
近10年来,深度学习技术得到了长足进步,在图像增强领域取得了显著的成果,尤其是以GAN为代表的生成式模型在图像复原、老片修复,图像超分辨率等方面大放异彩。图像超分辨率是视频增强方面,用于提升画质的典型应用。生成对抗网络GAN使得在图像分辨率增加的同时,保持细节特征,补充生成真实的纹理,其中应用广泛的工作是Real-ESRGAN。 扩散模型DiffusionModel在图像超分辨率这方面的新的应用,展现出其超过GAN的生成多样性和真实性。看完后,你会发现,还在用GAN做图像超分辨率吗?已经OUT了,快来试试DiffusionModel吧!
28147 3
【OpenVI-图像超分实战篇】别用GAN做超分了,快来试试基于扩散模型的图像超分吧!
|
监控 安全 数据安全/隐私保护
在开源代码的时候该如何避免安全风险的发生?
作为开发者来讲,不管是在实际开发中使用开源项目,还是直接投身于开源的贡献中,关于开源相关的内容想必都有自己独到的见解。开源与开发者息息相关,可能有的开发者会觉得不使用开源项目,自己就与开源无关了?这种想法是片面的,因为就算没有在实际开发中使用开源项目,但是在实际开发中肯定会用到一些第三方的插件,那么能保证这些插件没有用到开源的内容么?所以,开源与每一位开发者都有联系。
420 2
在开源代码的时候该如何避免安全风险的发生?
|
开发框架 移动开发 .NET
无影云应用助力天猫APP 打造云上3D全实时虚拟购物场景
手机天猫APP通过无影云应用加载3D场景,降低用户准入门槛,实现用户在线实时语音、文字互动,让用户获得游戏般的沉浸式“逛街”体验。无影自研ASP协议支持全端接入、弱网抵抗、多点触控等能力,云资源多地域部署,智能调度就近接入,保证了用户高清、流畅的体验效果。
860 0
无影云应用助力天猫APP 打造云上3D全实时虚拟购物场景