8086cpu内存地址线有20位,寻址空间可以达到1M,但是寄存器却只有16位,所以为了访问到所有的内存空间,必须得使用两个寄存器。于是就有了段寄存器和基址寄存器。但是两个寄存器就一共有32位了,所以用不完,主要是第一个寄存器分多少位,第二个分多少位。第一个寄存器代表的内容叫段,第二个寄存器代表的内容叫偏移量。使用段寄存器的值和基址寄存器的值来定位一个内存。形成了 段:偏移量 的内存访问方式。通常情况下,偏移量都是直接拉满,使用16位。

8086存在的问题是谁都可以访问内存,可以自由修改内存上任意位置的数据,也就是说,在8086下,我随便写一个程序,把操作系统的数据给改了也是没问题的。

因此80286引入了分段的保护机制,首先也是给内存分段,每段的大小可以不一致。先在内存中留下一小块,记录下每段的起始位置和大小,同时还有每个段读写属性的和访问等级等,读写属性包括可读可写等权限,当要访问这个段上的数据时,只有等级够了才允许访问。这就达到了内存保护的目的。6个字节就可以记录一个段的信息。记录下这写信息的那一块内存就叫做描述符表,里边记录了所有的段,每个段6个字节。这个表的起始位置通过一个寄存器GDTR保存起来,因此所有程序都可以找到这个表。一般对于我们的现在使用的电脑来说,计算机一旦开机,把整块内存的所有段都规划好了,就往GDTR寄存器保存表的起始地址。

当进入80386后,地址线拓展到了32条,可访问内存空间达到了4GB,寄存器也达到了32位。按道理说就不需要两个寄存器来定位一个地址了,也就是不需要分段了。但80386为了达到内存保护功能,还是使用了分段的思想。原理也是和80826一样,只是位数变了,段描述符变成了8个字节。如果要切换到64位模式我暂时不知道是怎么样的,那样基址就有64位了。

坑爹的是为了向下兼容,80386刚开机时使用的是8086的模式,也称为实模式。也就是说,电脑运行后,没有段描述符表,访问内存的方式也是段:偏移量的方式。很多支持32位保护模式的寄存器都没用上。

于是存在了模式切换的需要。

模式切换,主要就是建立段描述符表,通知CPU,让CPU改变寻址方式、转换到相关32位的操作,应该就是切换到相关线路。

模式切换的方法也不难,就是执行一段代码。实现这段代码的原理或者说步骤为:
第一步,写模式切换代码之前,先规划你的内存分段,理论上随便你怎么分,分多少段都行,但是CPU要求第一个段描述符必须为空。按照惯例,一般都有数据段、代码段、堆栈段。这样比较好对程序进行处理,因为数据段可读可写、代码段可读不可写,它们是不一样的。
第二步,创建段描述符表,怎么创建呢?首先是找一块内存,起始位置作为段描述符的基址,因为运行这段代码前,CPU在16位的8086模式下运行,因此你可以把你的段描述符表写在任何地方,从那块内存开始,前8个字节写入空值(第一段为空),第二个8字节就开始写入设计的好的第一个段描述符了,8个字节保存一个段描述符,以此类推。
第三步,通知CPU,主要包括填写GDTR寄存器和修改cR0寄存器pe位的值。GDTR一共有48位,前16位记录的是段描述符表的大小,后32位记录的是段描述符表的基址,因为一个地址有32位嘛,如此,其他寄存器就可以找到GDTR寄存器的值啦!这样一来,CPU就通知完毕了。
第四步,清空缓冲区的代码,因为之前的代码都是16位了,以后要切换到32位模式运行了,这些代码不能运行了。

模式切换的这段代码也可以放在启动扇区里,达到程序一运行就立马改成32位保护模式的效果。

需要说明的是:内存分段是可以重叠的,比如把所有的整块内存空间作为数据段,然后其中一部分或者也是整块内存空间作为代码段,当数据段是4GB的整块空间,代码段也是4GB的整块空间时,叫做平坦模式。

参考:
全局描述符表
进入保护模式
结合p21、p27、p28一起看

观察到的小细节:
1,汇编中,db表示一个字节,dw表示两个字节,这个d并不代表double的意思,但是dword表示四个字节,这个d是double的意思,所以dw并不是dword的缩写。
2.注意看以下两张图片中的汇编代码都不带变量名的。就可以定义段界限、段基地址。并且大小不一样。

原因是定了标号,比如NullDescriptor, DataDescriptor,CodeDescriptot.标号的作用是记录了位置,可以理解为数组名,虽然里边的每一段大小不一样。

试图理解80836实模式转变为保护模式相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 任务切换——《x86汇编语言:从实模式到保护模式》读书笔记38

    任务切换--<x86汇编语言:从实模式到保护模式>读书笔记38 本文及后面的几篇博文是原书第15章的学习笔记. 本章依然使用第13章的主引导程序. 1. 协同式多任务与抢占式多任务 有两种 ...

  7. 任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35

    任务和特权级保护(四)--<x86汇编语言:从实模式到保护模式>读书笔记35 7. 正式进入用户程序的局部空间 67 mov ebx,message_1 68 call far [fs:P ...

  8. 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

    本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:"文王拘而演<周易> ...

  9. 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14

    首先来段题外话:之前我发现我贴出的代码都没有行号,给讲解带来不便.所以从现在起,我要给代码加上行号.我写博客用的这个插入代码的插件,确实不支持自动插入行号.我真的没有找到什么好方法,无奈之下,只能按照 ...

最新文章

  1. 电源适配器和充电器的区别和关系
  2. 如何实现拼音与汉字的互相转换
  3. 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
  4. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现
  5. 入门C语言10问10答
  6. c语言程序求一一组数平均值,编写求一组整数的和与平均值的程序
  7. python中的timeit模块的用法
  8. Mysql - 解决Access denied for user ''@'localhost' to database 'mysql'问题
  9. Windows workflow foundation之旅(三)——指南2(创建状态机工作流)(上)
  10. 外挂的艺术-单机游戏辅助工具-网络游戏外挂
  11. 分享nbsp;康奈尔大学做笔记的方法
  12. Crosses and Crosses (Multi-SG+打表 博弈)
  13. android硬编码h264数据,并使用rtp推送数据流,实现一个简单的直播-MediaCodec(二)
  14. 高职计算机应用与信息检索,信息检索论文,关于高职院校图书馆对学生信息检索的教育相关参考文献资料-免费论文范文...
  15. 【2021-01-11】JS逆向之美团模拟登入
  16. RabbitMQ-Plugin configuration unchanged.
  17. Python 实现简单的客户端认证
  18. 2.4 旋转曲面 (2)
  19. 安装并使用EVE模拟器
  20. U3D Shader半兰伯特模型

热门文章

  1. SDUT OJ[3109] 买买买 背包 dp
  2. Android运行时识别API版本
  3. Linux+Apache+Postgresql+PHP安装Drupal7.15
  4. NAT和IPsec并存的几种模型(方案一)
  5. bash命令的使用方法
  6. Navicat Monitor v1.7的新功能说明
  7. 【隔离】跨区消息穿透定义
  8. 设置sqlplus环境变量
  9. cas单点登陆。就这一篇就够了!!!!!
  10. Android WebView使用