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、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、网络协议、数据库等基于操作系统的内容时,也会遇到很多麻烦,导致理解的不够深刻。
希望通过不断的学习,有朝一日能在学习各种技术、遇到各种技术问题时从不同层面进行分析,并纳入自己的知识体系中,与已有知识结合起来。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章