80386学习(一) 80386CPU介绍
一.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介绍的更多相关文章
- 人工智能深度学习Caffe框架介绍,优秀的深度学习架构
人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...
- iOS学习之NSBundle介绍和使用
iOS学习之NSBundle介绍和使用 http://blog.csdn.net/totogo2010/article/details/7672271 新建一个Single View Applicat ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Oracle GoldenGate学习之Goldengate介绍
Oracle GoldenGate学习之Goldengate介绍 (2012-10-02 17:07:27) 标签: 检查点 数据传输 队列 进程 分类: Goldengate Goldengate介 ...
- JMeter学习工具简单介绍
JMeter学习工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...
- 《从0到1学习Flink》—— 介绍Flink中的Stream Windows
前言 目前有许多数据分析的场景从批处理到流处理的演变, 虽然可以将批处理作为流处理的特殊情况来处理,但是分析无穷集的流数据通常需要思维方式的转变并且具有其自己的术语(例如,"windowin ...
- Java并发包下锁学习第一篇:介绍及学习安排
Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...
- python学习之——splinter介绍
Splinter是什么: 是一个用 Python 编写的 Web 应用程序进行验收测试的工具. Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL,然后你所开发的模拟的任何行为,都会 ...
- jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...
随机推荐
- Metasploit简单使用——后渗透阶段
在上文中我们复现了永恒之蓝漏洞,这里我们学习一下利用msf简单的后渗透阶段的知识/ 一.meterperter常用命令 sysinfo #查看目标主机系统信息 run scraper #查看目标主机详 ...
- trie树——【吴传之火烧连营】
突然发现好像没有讲过一种叫做tire树的神奇东西. 问题描述: 题目描述 [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势 ...
- HanLP的分词统计
HanLP的分词效果鄙人研究了HanLP,他的分词效果确实还可以,而且速度也比较快,10的数据是9000毫秒 @SneakyThrows@Overridepublic LinkedHashMap< ...
- 2017-18一《电子商务概论》本科作业-商A1551
第1次作业: 1 2017年双十一新营销方案 2 销售额达1682亿元分析组成及了解猫狗大战 3 破亿店铺举例. 第2次作业: 1.你如何来定义和理解电子商务?电子商务对社会经济带了怎样的影响,企业. ...
- 实验三 HTML表格和表单的制作
实验三 HTML表格和表单的制作 [实验目的] 1.掌握表格的创建.结构调整与美化方法: 2.熟悉表格与单元格的主要属性及其设置方法: 3.掌握通过表格来进行网页页面的布局方法. [实验环境] 连接互 ...
- go正则
package main import ( "fmt" "regexp" ) func main() { context1 := "3.14 1231 ...
- linux(centos8):配置docker的cgroup driver为systemd
一,为什么要修改docker的cgroup driver? 1,什么是cgroups? cgroups(Control Groups) 是 linux 内核提供的一种机制 它可以限制.记录任务组所使用 ...
- Activiti的流程实例【ProcessInstance】与执行实例【Execution】
最近,我在做流程引擎Activiti相关的东西,刚开始时的一个知识点困扰了我许久,那就是Activiti的ProcessInstance与Execution的区别,这是一个Activiti的难点,能够 ...
- JavaSE学习笔记05面向对象编程01
面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...
- C# 将Excel里面的数据填充到DataSet中
/// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...