0 引言

从80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式(v86模式)。只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode。实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;同时,保护模式还引入了“权限”,这是操作系统演变过程中非常重要的一步。

实模式与保护模式的最大差别在于内存寻址,可以认为实模式与保护模式下CPU对物理内存地址采用了两种不同的计算方式。

1 实模式下物理地址的计算方式

图1.1 实模式下物理地址的计算方式

如图1.1所示,实模式下CPU对内存物理地址的计算非常简单粗暴,即将CS段寄存器的值左移4位然后与IP寄存器中的值相加,得出的结果(20位的地址)就是要访问的内存的物理地址。简单粗暴的同时带来的问题也很明显,就是非常的不安全!所有程序都可以修改所有的物理内存,试想一下在写程序输出“hello world”的时候不小心把操作系统的关键内容给修改了,这是一件多么可怕的事!

2 保护模式下物理地址的计算方式

80286开始就引入了保护模式,由于286是一个过渡产品,本文选取了更具有代表性的80386来讲解保护模式。在保护模式下CPU对物理内存地址的计算与实模式下可以说是完全不同。保护模式采用分段的方式来为每个应用规定其能访问的内存区域,从而实现了保护的目的。保护模式下的段与实模式下的段不同,保护模式下的段的长度是可变的,而实模式下段的长度是不可变的,因为实模式下引入段的概念是为了更好的让只有16位寄存器的8086CPU去访问20位的地址空间,而非出于保护的目的。

2.1保护模式下的重要数据结构

(1)描述符(Descriptor)

图2.1 段描述符(Descriptor)

段描述符记录的是每个段的基址、界限、属性信息。如图2.1所示,每个段描述符占8个字节,段描述符由三大主要部分组成:段界限(20位)、段基址(32位)、段属性(12位)。(由于历史遗留问题他们都被分开存放)。段界限记录的是段内偏移地址的最大值,段基址记录的是该段的起始物理地址,段属性记录的是段的特权级、描述符类型等信息。

(2)全局描述符表(Global Descriptor Table,GDT)

每个段描述符记录的是一个内存段的信息,多个段描述符就构成了一个段描述符表(其实就是一个存放段描述符的数组)。全局描述符表(GDT)记录的是系统中所有可用的段的描述符。它存放在物理内存中,那么,操作系统是如何知道GDT的存在在哪呢?——通过特殊的硬件GDTR(Global Descriptor Table Register)。支持保护模式的CPU需要具有一个特殊的硬件GDTR。GDTR是一个48位的寄存器,它记录着GDT的起始地址以及界限。具体结构如2.2所示。

图2.2 GDTR结构示意图

在由实模式向保护模式转化的过程中,GDTR通过lgdt指令进行初始化。

(3)段选择子(Selector)

上面介绍了段描述符记录的段的基本信息,GDT记录的全局可用的段的信息,那么每个应用程序如何访问自己的内存段呢?——通过段选择子(Selector)。段选择子可以理解为是一个GDT中的索引,但与索引又略有不同。段选择子的结构如图2.3所示。

图2.3 段选择子结构示意图

段选择子占2个字节,其中RPL(Request Privilege Level)记录的是请求特权级,即以什么样的权限去访问段。

TI(Table Indicator)记录的是该段位于GDT还是LDT(Local Descriptor Table,与GDT类似)。描述符索引记录的是访问的段在描述符表(GDT or LDT)中的位置(相对偏移量)。值得注意的是,在启动保护模式之后段寄存器(CS、DS、ES等等)存储的就不再是段的物理基址而是段选择子。了解这一点很重要!!但是我们使用汇编编程时无需完成段选择子到段基址的转换,因为从段选择子到段基址的转换由硬件自动完成。

2.2保护模式下物理地址的计算

前文中说到了保护模式下计算物理地址所用到的三个重要数据结构,下面就讲讲保护模式下究竟是如何计算物理地址的。

图2.4 保护模式下物理地址的计算方式

如图2.4所示,在保护模式下物理地址计算可分为如下几步:

  1. 从段寄存器中取出选择子。
  2. 通过段选择子的索引信息以及GDTR记录的GDT的地址找到段描述符的地址。
  3. 检查权限等信息,完成后取得段的物理基址。
  4. 将物理基址与EIP寄存器中的偏移量相加得到实际物理地址。

其中保护模式的关键步骤在于第3步,该部分完成了对该访问请求是否有访问权限,也正是该部分实现了对内存的“保护”。

每次进行物理地址计算时都要进行访问内存中段描述符吗?——不是的,请看↓↓↓

3 关于段寄存器的一些不为人知的“秘密”

段寄存器(DS、CS、SS、ES、GS、FS)真的是只有16位吗?关于段寄存器为16位寄存器的说法是不严谨的。

图3.1 段寄存器的结构

如图3.1所示,每个段寄存器的可见部分(即我们可以通过mov指令读写的部分)为16位。可见部分记录着段选择子的信息,其隐藏部分记录着该选择子对应的段的信息,其中隐藏部分是在使用段寄存器第一次访问内存时自动从段描述符中加载过来的。那为什么这么做呢?原因很简单,就是为了加快访问内存。上文中说到GDT是存储在内存中的,若每次使用段选择子时都需要去内存中找到段描述符,然后再进行地址计算,这不就相当于访问了两次内存了嘛,访问速度也是可想而知的。硬件工程师也考虑到了这一点,于是就把段的信息加载到段寄存器的隐藏部分,每次需要段基地址时需要直接从段寄存器中获取。

参考文献

1.我们一起学习实模式和保护模式

2.《Orange's一个操作系统的实现》于渊

3.80286与保护模式

X86实模式与保护模式简介相关推荐

  1. x86实模式到保护模式 李忠 王晓波

    x86实模式到保护模式  李忠 王晓波 第3到4章 各个进制间的转换省略 实验环境 编译器  nasm 虚拟机 virtual box 小程序  hexview   观察编译后的机器代码 fixvhd ...

  2. x86汇编语言从实模式百度云_x86汇编语言:从实模式到保护模式

    x86汇编语言:从实模式到保护模式2013年1月由电子工业出版社出版发行,总共6000行的源代码,全方位地向读者展现汇编语言程序设计之美.尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们 ...

  3. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

    目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...

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

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

  5. 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01

    本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程 ...

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

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

  7. 《x86汇编语言:从实模式到保护模式》视频来了

    <x86汇编语言:从实模式到保护模式>视频来了 很多朋友留言,说我的专栏<x86汇编语言:从实模式到保护模式>写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节. ...

  8. 《x86汇编语言:从实模式到保护模式》读书笔记之后记

    本来打算把整本书的读书笔记写完,可是由于有其他的计划(就叫做"B计划"吧)且优先级更高,所以我的读书笔记搁浅了.为了全力以赴执行B计划,我的博客要荒芜一段时间(我希望不要永远荒芜下 ...

  9. 处理器在实施任务切换时的操作——《x86汇编语言:从实模式到保护模式》读书笔记39

    处理器在实施任务切换时的操作--<x86汇编语言:从实模式到保护模式>读书笔记39 处理器可以通过以下四种方法实施任务切换: 1. call指令或者jmp指令的操作数是GDT内的某个TSS ...

最新文章

  1. DropDownList--下拉菜单
  2. [EffectiveC++]item17:以独立语句将newed对象置入智能指针
  3. Three.js中自定义控制几何体的点和面的属性
  4. K8S 基本架构与常用术语
  5. GetCurrentDirectory和SetCurrentDirectory函数
  6. 面向对象编程03—封装、继承、重写、MRO、多态
  7. Python基本数据类型之列表
  8. python缩进格式作用_关于自动缩进格式问题,高手帮忙!
  9. 开发自己的框架——(二)数据库工具类的封装
  10. 爬虫软件python功能_Python 网络爬虫程序详解
  11. 深度学习之生成式对抗网络 GAN(Generative Adversarial Networks)
  12. linux云自动化运维,linux云自动化系统运维17(延时服务及定时服务)
  13. java实验指导答案华软_Java核心编程技术实验指导教程
  14. 青岛农业大学计算机分数线,青岛农业大学录取分数线2021是多少分(附历年录取分数线)...
  15. ECShop 批量打印快递单
  16. 《2020-2021中国开发者调查报告》发布了!
  17. 小白教你把数字翻译成字符串
  18. 基于Qt的智能管家客户端设计
  19. 神经网络中BP算法的推导
  20. 看PDF时点击书签页面变小的解决方法

热门文章

  1. php 获取文件夹下面的文件列表和文件夹列表
  2. HTML5 Web Audio Api-2 发声oscillator
  3. 官方蓝牙4.0基本概念
  4. 谷歌浏览器登录不了账号_腾讯qq无故冻结账号什么情况?qq号为什么登录不了方法官方回应...
  5. ps软件哪个好?十年老用户推荐这两个给你
  6. android chrome 地址栏底部,Android Chrome地址栏下移方便单手操作
  7. python关键词共现图谱_如何用知网导出的关键词 几秒 生成共现矩阵及图谱 》完整版...
  8. 创维YS代工E900V21E/TY1608-S905l3B-8822CS及7668无线通刷线刷包
  9. 像素、分辨率及PPI各自含义与区别及目前主流手机的分辨率介绍
  10. TextView过长显示省略号, TextView文字中间加横线