一.80386CPU介绍

  Inter80386CPU是Inter公司于1985年推出的第一款32位80x86系列的微处理器。80386的数据总线是32位的,其地址总线也是32位,因而最大可寻址4GB的存储空间。

  80386作为x86系列CPU的一员,保持着对更早生产的x86CPU的向前兼容。80386在当时主要为支持高性能的应用领域和多用户、多任务操作系统而设计,提供了硬件级的特权级保护、多任务切换、内存分页等功能。

  80386有三种运行模式:实模式、保护模式虚拟8086模式

  在实模式下,80386和8086的行为保持一致,只能访问20位(1M)的地址空间,内部实际32位的寄存器也只有低16位有效。实模式主要是为了兼容运行在8086CPU上的程序,所以80386加电后,默认就运行在实模式下

  要想充分发挥80386的对于多任务的支持功能,需要使80386进入保护模式。保护模式是80286以及后续的x86CPU都具有的一种工作模式。保护模式下的80386内存寻址范围达到了硬件设计的上限:2^32byte,即4GB。保护模式提供了诸如内存保护、内存分页机制以及硬件虚拟存储管理等功能,为多用户。多任务的高效、可靠、安全的操作系统实现提供了良好的支持。因此,主流的现代操作系统例如Linux、Windows(Windows95及以后)其内核均运行在x86的保护模式之上。

  虚拟8086模式的工作模式介于实模式和保护模式之间,虚拟8086支持多任务、内存分页等功能。但运行的每一个独立任务均处于实模式之下。虚拟8086这一模式由于其中庸性,应用范围相对较小。  

二.80386对于8086的主要改进

  80386能够兼容的运行之前在8086、80286CPU上运行的程序,但80386比起16位的8086CPU无论是性能还是功能上都有质的提升

性能方面的主要改进:

更宽的数据总线和地址总线

  扩展到32位的地址总线使得80386能够访问更大的地址空间,同时32位的数据总线比起8086的16位也增加了数据的传输速度。

高速缓存

  80386在CPU内部增加了对于内存的高速缓存器。高速缓冲存储器会拦截所有对于内存的访问,并判断所需数据是否已经存在于高速缓存中。

  如果缓存命中,则直接将高速缓存中的数据交给CPU;如果缓存未命中,则进行常规的存储器访问,获取数据交给CPU的同时也将数据存入高速缓存。由于高速缓存距离CPU更近,访问性能也强于主存等外部存储器(至少一个数量级),由于局部性原理,使用高速缓存能够极大的提高CPU访问内存的效率。

指令流水线

  虽然CPU是按照顺序进行机器指令的执行,表面上看必须一条指令执行完才能执行下一条指令。但事实上,在一条机器指令完整的执行过程中,内部也可分为多个步骤。

  例如在80386CPU中,就将一条指令的执行分为三个小步骤:取址译码执行,理想情况下每个步骤都会耗费大约一个时钟周期

  在福特的流水线汽车生产过程中,为首的工人们负责制造汽车的骨架;中间的工人负责加装车门、轮胎等;流水线尾端的工人则负责刷漆、装潢等。安装车门的工人不需要等待尾端的工人将当前的汽车刷漆完毕后,便可提前进行下一辆车车门、轮胎的安装,比起传统的手工作坊那种从头到尾,阻塞式的生产方式,流水线的生产效率要高得多。

  CPU的设计者正是从流水线式工厂生产中获取了灵感,对CPU的指令执行过程进行了流水线优化。将CPU执行硬件指令的过程比作一辆汽车的生产,CPU内部的执行单元在执行指令时,取址器件同时可以提前的将下一条指令提前的从存储器或是高速缓存中读取流水线式的指令执行过程,使得取址、译码和执行单元时时刻刻在饱和的工作着,减少了不必要的等待时间,提高了CPU整体的执行效率。

  随着CPU的发展,更先进的CPU将指令执行的流水线步骤分解的更加细致,以应对越来越高的主频、越来越短的时钟周期例如下一代的80486CPU便将指令流水线由之前的3步进一步分解为了5步(取指令,一级译码,二级译码,执行,写回结果),而如今最先进的CPU的流水线深度甚至已经达到了惊人的十几甚至几十。

  cpu指令流水线技术就是一种将指令分解为多步,让不同指令的各步操作重叠,从而实现几条指令的并行处理,以加速程序运行过程的技术。

功能方面的主要改进:

优先级保护

  在8086CPU下,应用程序可以随意的访问地址空间中的任意位置,恶意的攻击程序甚至能够修改属于操作系统内核的代码、数据,造成巨大的破坏。

  在多任务、多用户的系统软件需求下,操作系统等系统级软件的设计者迫切的希望CPU硬件能提供一些必要的功能以保护内存、外设,避免运行良好的程序被其它程序、其它用户有意无意的破坏。毕竟软件的绝大多数功能都是依赖硬件的,如果没有硬件的帮助,单独软件层的保护实现会是漏洞百出的。

  为此80286以及之后的x86CPU提供了一系列的,主要围绕特权级权限的保护功能。这些功能必须处于保护模式下才能使用,这也是保护模式名称的由来。

  80386能够为不同的程序段、数据段以及栈段赋予不同的特权级,由两个bit位决定,00、01、10、11这四种,数字越小权限越高。举个例子,高运行特权级的程序能够访问同级或更低访问特权级的数据段,反之低运行特权级的程序则无法直接访问高访问特权级的数据段。

  BIOS在导入操作系统时,操作系统会将自己设置为最高优先级00,而被操作系统加载的用户应用程序则会被操作系统设置为更低的特权级11,这样就不会出现8086中应用程序能直接修改操作系统内核数据的问题。介于其中的01、10特权使用的并不是很多,比较关键的设备驱动程序,虚拟机程序可能会被设置为高于应用程序,但低于宿主操作系统的程序特权级。

  这里对80386特权级保护机制的介绍非常笼统,屏蔽了很多细节,关于特权级保护会在后面的博客中进行更详细的介绍。

存储器分页管理机制

  在保护模式下,80386可以开启存储器分页管理功能。开启了分页管理功能的80386,会将物理内存分隔为4KB固定大小的页。

  在未开启页机制时,线性地址就是最终的物理地址;而开启了页机制后,线性地址还需要通过页表进行映射转换才能获得最终的物理地址。

  那么CPU会提供分页机制来对线性地址到真实物理地址的转换做一步抽象呢?这主要是为了给操作系统提供虚拟内存管理功能提供方便。在虚拟内存管理中,操作系统能够将暂时不用的程序内存,放入磁盘的swap交换区域,并在需要时又从磁盘换回内存。这样每个程序看起来都独占了很大的一片内存(虚拟内存),其总和可能远大于物理内存实际容量,这就是虚拟内存管理带来的好处。

  更早时期的操作系统设计者会在新程序加载,而物理内存不足时将某些非运行的程序内存整体的换出到磁盘。在提供了页机制后,换出的粒度就控制在4KB的页这一级别,效果会好很多,因为根据局部性原理,在某一时刻一个程序内部不同片段被访问的频率具有很大差异,只将不常用的内存换出,省去任务切换时的磁盘IO带来的性能提升是巨大的。

  80386页表中的页表项记录着当前页是否处于物理内存中,当寻址最终映射访问的内存页不在物理内存中,CPU会触发缺页中断异常。页内存访问不存在时发出缺页中断异常完全是由CPU硬件完成的,操作系统在实现虚拟内存管理时,需要提供对应的内存缺页中断处理程序,将对应的缺页内存换入物理内存。缺页中断机制是硬件级别的,因此效率将高于纯粹由程序软件实现的分页功能。

  和特权级保护一样,这里也屏蔽了诸如页表、页表项的数据结构详情,程序逻辑地址访问时转换为物理地址的完整过程,以及页表寄存器等等细节。存储器分页管理机制也将在后续的博客中展开介绍。

三.总结

  为了更好的学习ucore操作系统的课程,最近一段时间通过阅读《x86汇编语言 从实模式到保护模式》、《微型计算机硬件及技术 微机原理》等书和博客,学习和了解了关于80386CPU相关的硬件知识和汇编语言。以写博客的方式,对最近的学习进行一个系统的总结,加以巩固,以适应操作系统课程内容的学习。

  计算机体系的很多核心知识是一环扣一环的,如同一张绵密的网。没有8086CPU相关知识的基础,学习80386将遇到不小的困难;如果没有学习80386CPU相关的知识,去掌握基于80386CPU的操作系统时也会感到迷茫。更进一步的,没有一个良好的关于操作系统的认知,在学习JVM、网络协议、数据库等基于操作系统的内容时,也会遇到很多麻烦,导致理解的不够深刻。

  希望通过不断的学习,有朝一日能在学习各种技术、遇到各种技术问题时从不同层面进行分析,并纳入自己的知识体系中,与已有知识结合起来。

80386学习(一) 80386CPU介绍的更多相关文章

  1. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...

  2. iOS学习之NSBundle介绍和使用

    iOS学习之NSBundle介绍和使用 http://blog.csdn.net/totogo2010/article/details/7672271 新建一个Single View Applicat ...

  3. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  4. Oracle GoldenGate学习之Goldengate介绍

    Oracle GoldenGate学习之Goldengate介绍 (2012-10-02 17:07:27) 标签: 检查点 数据传输 队列 进程 分类: Goldengate Goldengate介 ...

  5. JMeter学习工具简单介绍

    JMeter学习工具简单介绍   一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...

  6. 《从0到1学习Flink》—— 介绍Flink中的Stream Windows

    前言 目前有许多数据分析的场景从批处理到流处理的演变, 虽然可以将批处理作为流处理的特殊情况来处理,但是分析无穷集的流数据通常需要思维方式的转变并且具有其自己的术语(例如,"windowin ...

  7. Java并发包下锁学习第一篇:介绍及学习安排

    Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...

  8. python学习之——splinter介绍

    Splinter是什么: 是一个用 Python 编写的 Web 应用程序进行验收测试的工具. Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL,然后你所开发的模拟的任何行为,都会 ...

  9. jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门

    一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...

随机推荐

  1. CF877E Danil and a Part-time Job

    题目大意: link 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 pow 将一个点 x 的子树 ...

  2. STM32之旅4——USART

    STM32之旅4--USART 串口也是用的比较多的,在STM32CubeMX中生成代码后,需要添加一些代码才可以用. drv_usart.h: #ifndef __DRV_USART_H #defi ...

  3. 利用 JS 脚本实现网页全自动秒杀抢购

    利用 JS 脚本实现网页全自动秒杀抢购 倒计时页面: 倒计时未结束时,购买按钮还不能点击. 结束时,可以点击购买,点击后出现提示"付款成功" 展示效果 1.制作测试网页 首先我们来 ...

  4. 多测师讲解自动化测试 _RF连接数据库_高级讲师肖sir

    RF连接数据库:1.Connect To Database(连接数据库)2.Table Must Exist(表必须存在)3.Check If Exists In Database(查询某条件是否存在 ...

  5. Android开发Settings源码分析之主界面加载(二)

    现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套[Android进阶学习视频].[全套Android面试秘籍].[Android知识点PDF] ...

  6. ES异常处理-NoNodeAvailableException

    1.问题描述 ES client客户端能创建,但是在用客户端操作时报:NoNodeAvailableException[None of the configured nodes are availab ...

  7. 【xenomai内核解析】系列文章大纲

    xenomai内核解析 本博客为本人学习linux实时操作系统框架xenomai的一些记录,主要剖析xenomai内核实现,以及与linux相关的知识.方便读者定位具体文章,现列出本博客大纲,后续会陆 ...

  8. centos8安装RabbitMQ

    一.安装erlang # 添加仓库 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh ...

  9. minianaconda3安装

    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh chmod +x Miniconda3-lates ...

  10. Jmeter入门(4)- 注意事项

    一.中文乱码问题的解决方法 1. 将HTTP请求的内容编码改成UTF-8 2. 修改配置文件jmeter.properties 将jmeter安装目录的bin目录下的jmeter.properties ...