实模式和保护模式都是CPU的工作模式,CPU的工作模式是指CPU的寻址方式、寄存器大小等用来反应CPU在该环境下如何工作的概念。

一、实模式工作原理

实模式出现于早起8088CPU时期。当时由于CPU的性能有限,一共只有20位地址线(所以地址空间只有1MB),以及8个16位的通用寄存器,以及4个16位的段寄存器。所以为了能够通过这些16位的寄存器去构成20位的主存地址,必须采用一种特殊的方式。当某个指令想要访问某个内存地址时,它通常需要用下面的这种格式来表示:

(段基址:段偏移量)

其中第一个字段是段基址,它的值是由段寄存器提供的(一般来说,段寄存器有6种,分别为cs,ds,ss,es,fs,gs)

第二个字段是段内偏移量,代表我们要访问的这个内存地址距离这个段基址的偏移。它的值就是由通用寄存器来提供的,所以也是16位。CPU采用段基址左移4位加段内偏移量的方式来组成20位的地址:

物理地址=段基址<<4+段内偏移

所以假设段寄存器中的值是0xff00,段偏移量为0x0110。则这个地址对应的真实物理地址是:

0xff00<<4+0x0110=0xff110

由上面的介绍可见,实模式的”实“更多地体现在其地址是真实的物理地址。

二、保护模式工作原理

随着CPU的发展,CPU的地址线的个数也从原来的20根变为现在的32根,所以可以访问的内存空间也从1MB变为现在的4GB,寄存器的位数也变为32位。所以实模式下的内存地址空间的计算方式就已经不再适合了。所以就引入了现在的保护模式,实现更大空间的,更灵活也更安全的内存访问。

在保护模式下,CPU的32条地址线全部有效,可寻址高达4GB字节的物理地址空间;但是我们的内存寻址方式还是得兼容老方法(这也是没办法的,有时候是为了方便,有时候是一种无奈),即(段基址:段偏移量)的表示方式。当然此时CPU中的通用寄存器都要换成32位寄存器(除了段寄存器)来保证寄存器能够访问所有的4GB空间。

此时的偏移值和实模式下是一样的,就是变成了32位而已,而段值依旧是存放在原来16位的段寄存器中,但是这些段寄存器存放的却不再是段基址了,毕竟之前说过实模式下寻址方式不安全,我们在保护模式下需要加一些限制,而这些限制可不是一个寄存器能够容纳的,于是我们把这些关于内存段的限制信息放在一个叫做全局描述符(GDT)的结构里。全部描述符中含有一个个表项,每一个表项称为段描述符。而段寄存器在保护模式下存放的便是相当于一个数组索引的东西,通过这个索引,可以找到对应的表项。段描述符存放了段基址、段界限、内存段类型属性(比如是数据段还是代码段,注意一个段描述符只能用来定义一个内存段)等许多属性,具体信息如下图:


其中,段界限表示段边界的扩张最值,即最大扩展多少或最小扩展多少,用20位来表示,它的单位可以是字节,也可以是4kB,这是由G位决定的(G为1时表示单位为4KB)。

实际段界限边界值=(描述符中的段界限+1)*(段界限的单位大小(即字节或4KB))-1,如果偏移地址超过了段界限,CPU会抛出异常。

全局描述符位于内存中,需要用专门的寄存器指向它后,CPU才知道它在那里。这个专门的寄存器便是GDTR(一个48位的寄存器),专门用来存储GDT的内存地址及大小。

最后我们再介绍一下一个新的概念:段的选择子。段寄存器 CS、 DS、 ES、 FS、 GS、 SS,在实模式下时,段中存储的是段基地址,即内存段的起始地址。 而在保护模式下时,由于段基址已经存入了段描述符中,所以段寄存器中再存放段基址是没有意义的,在段寄 存器中存入的是一个叫作选择子的东西。选择子“基本上”是个索引值,虽然它还有其他内容,不过作为初学者暂时忽略也没太大关系。由于段寄存器是 16 位,所以选择子也是 16 位,在其低 2 位即第 0~1 位, 用来存储 RPL,即请求特权级(有兴趣的可以了解一下,不想了解的忽略即可,跟用户态和内核态相关的),可以表示 0、 1、 2、 3 四种特权级。在选择子的第 2 位是 TI 位,即 Table Indicator,用来指示选择子是在 GDT 中,还是 LDT 中索引描述符。 TI 为 0 表示在 GDT 中索引描述符, TI 为 1 表示在 LDT 中索引描述符。选择子的高 13 位,即第 3~15 位是 描述符的索引值,用此值在 GDT 中索引描述符。前面说过 GDT 相当于一个描述符数组,所以此选择子中的索引值就是 GDT 中的下标。选择子结构如下:

此外, 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务切换(switch)和保护任务环境(context); 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离; 支持虚拟8086方式,便于执行8086程序。

CPU的实模式和保护模式相关推荐

  1. CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义

    一 计算机实模式和保护模式 实模式 在实模式下,内存被限制为仅有1M字节(220 字节).有效的地址从00000到FFFFF (十六进制). 这些地址需要用20位的数来表示.一个20位的数不适合任何一 ...

  2. CPU的三种工作模式:实模式、保护模式、长模式

    文章目录 **实模式** **保护模式** **长模式** **总结** 实模式 访问内存 实模式也就是说寄存器中存放的地址都是真实地址,比如下面这段程序: data SEGMENT ;定义一个数据段 ...

  3. 3.操作系统——CPU的实模式、保护模式和长模式

    有实模式.保护模式.长模式 实模式16(实地址模式) 真实分为两个方面: 运行真实指令.不区分指令动作,只是直接执行指令的真实功能 发往内存的地址是真实.不加限制的. 总结来说就是,这个模式下直接往物 ...

  4. 深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)

    cpu的保护模式由来 分段机制 8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8.同时,8086的诞生也是处理器内存寻址技术的第一次飞跃. 对于一 ...

  5. 操作系统学习:实模式进入保护模式

    本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 保护模式相关介绍 从实模式进入保护模式其实经历 ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  7. 实模式与保护模式详解一:寄存器

    基本寄存器 在了解实模式与保护模式区别之前,先介绍一下几个基本的寄存器 通用寄存器 寄存器组中有8个32位寄存器,属于CPU内的寄存器,也称通用寄存器,按照用途可以分为数据寄存器组和指示器变址寄存器 ...

  8. 实模式和保护模式区别及寻址方式

    64KB-4GB-64TB? 我记得大学的汇编课程.组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为 ...

  9. 操作系统引导--从实模式到保护模式

    从开始到保护--系统开机引导 ------没有一个文档能写的通俗易懂,我希望写出来. 开机引导和实模式: 两个星期加上假期吐血整理,所述为计算机的开机引导,其中包括一系列计算机内存设置等等,由于没有老 ...

  10. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

最新文章

  1. android休眠唤醒驱动流程分析【转】
  2. Asp.Net MVC中Action跳转小结
  3. c语言有重复元素全排列,【求助】全排列 不重复 由小到大 输出 代码
  4. 页面加载后如何使JavaScript执行?
  5. 从零开始学python电子书-从零开始学Python程序设计 PDF 完整影印版
  6. 全球与中国血管重建装置市场投资现状及发展规划建议报告2022-2028年
  7. qlikview连接mysql_QlikView通过ODBC连接IBMDB2
  8. Provisional headers are shown in Chrome network tab
  9. SAP Cloud for Customer的work center显示逻辑
  10. 数值的加减会改变python中id,在python中调用Nan值并更改为数字
  11. linux学习第九天 (Linux就该这么学)
  12. origin对独立曲线进行操作
  13. 如何自学python知乎-你们都是怎么学 Python 的?
  14. django 类取消csrf_最新Django全套教程 半个月搞定Django
  15. 小程序的switch组件
  16. 字段分行加一 sql语句
  17. ie调试html代码,IE下的调试工具IE WebDeveloper
  18. unity 2d 动画
  19. 2023届深信服C++A卷笔试
  20. 用 Python 统计字数

热门文章

  1. Nginx性能提升--引入线程池性能提升9倍
  2. 数据结构-----队列笔记
  3. 从大厂出来后,我工资翻了一翻
  4. 仅能帮的(非技术分享)
  5. php 中tp3.2中c,thinkphp3.2笔记(2)调试模式,配置项C,创建模块, 四种URL模式,URL生成,跳转...
  6. 解释下列术语堆栈型计算机,第二章 计算机指令集结构
  7. python列表排序sort_python列表排序方法reverse、sort、sorted
  8. 前牙正常覆盖是多少_深覆合千万不要矫正?用图示告诉你深覆合深覆盖的区别是什么,有什么危害...
  9. 计算机应用基础第3次平时作业,计算机应用基础第3次作业.doc
  10. 帆软给报表块添加CSS