从操作系统基础1我们已经知道:操作系统作为用户与计算机硬件直接的接口,是配置在计算机硬件上的第一层软件,所以操作系统的运行必须要依赖一些基本的硬件,或者说需要一些基本硬件的支持。主要包括以下几种:CPU(Central Processing Unit)中央处理器、内存、中断、时钟
CPU中央处理器
中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心(Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。中央处理器主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)
主要制造商:Intel、AMD
CPU架构分类:
ARM架构:
ARM架构:精简指令集机器RISC(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,广泛地使用在许多嵌入式系统设计。
英国ARM公司本身并不靠自有的设计来制造或出售CPU,而是将处理器架构设计授权给其他制造商。
X86架构:X86架构是CPU执行的计算机语言指令集,基于Intel 8086且向后兼容的中央处理器指令集架构,包括Intel 8086、80186、80286、80386以及80486,由于以“86”作为结尾,因此其架构被称为“x86”。应用领域:个人计算机、服务器等。
X86架构又可分为如下类别
IA:Intel(英特尔)处理器的服务器称之为IA(Intel Architecture)架构服务器
IA-32:英特尔32位体系架构,X86从16位到32位是在原有的架构基础上进行修改(Intel称之为IA-32)
x86-32:现如今Intel把x86-32称为IA-32
x86-64
AMD64:x86架构的64位拓展,向后兼容于16位及32位的x86架构。x64于1999年由AMD设计,AMD首次公开64位集以扩展给x86,称为“AMD64”,AMD64和Intel64基本上一致。
Intel64:EM64T(Extended Memory 64 Technology)扩展64bit内存技术,本质上和AMD64一样都是IA-32的增强版本。
IA-64:64位的英特尔架构,英特尔安腾架构(Intel Itanium architecture),使用在Itanium处理器家族上的64位指令集架构,由英特尔公司与惠普公司共同开发。IA是Intel Architecture(英特尔架构)的缩写,64指64位系统。使用这种架构的CPU,包括Itanium和Itanium 2。此架构与x86及x86-64并不相容,操作系统与软件需使用IA-64专用版本。
Intel、AMD的CPU占领了大部分的PC市场,而ARM处理器则大量存在于手机和各种嵌入式设备中。
MIPS架构
MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。
应用领域:工作站等计算机平台,目前国内龙芯主要使用MIPS架构机器。
PowerPC架构
PowerPC 是一种精简指令集(RISC)架构的中央处理器(CPU),其基本的设计源自IBM(国际商用机器公司)的IBM PowerPC 601 微处理器POWER(Performance Optimized With Enhanced RISC;《IBM Connect 电子报》2007年8月号译为“增强RISC性能优化”)架构。二十世纪九十年代,IBM(国际商用机器公司)、Apple(苹果公司)和Motorola(摩托罗拉)公司开发PowerPC芯片成功,并制造出基于PowerPC的多处理器计算机。PowerPC架构的特点是可伸缩性好、方便灵活。
PowerPC 处理器有广泛的实现范围,包括从诸如 Power4 那样的高端服务器 CPU 到嵌入式 CPU 市场(任天堂 Gamecube 使用了 PowerPC)。PowerPC 处理器有非常强的嵌入式表现,因为它具有优异的性能、较低的能量损耗以及较低的散热量。除了像串行和以太网控制器那样的集成 I/O,该嵌入式处理器与“台式机”CPU 存在非常显著的区别。
2.CPU模式(mode)
CPU mode
CPU模式指的是CPU的工作状态,以及对资源和指令权限的描述。
内核模式(Kernel Mode):也可以称为核心态或者管理者模式,程序可以访问系统的所有资源,CPU全部指令可以无限制执行,也可以任意的对运行模式进行切换。
用户模式(User Mode):也称为用户态,应用程序不能访问一些受操作系统保护的资源。在用户模式,应用程序不能直接切换处理器模式。如果要进行模式切换,则必须产生中断才可以。产生中断后就进入了特权模式
两种模式的切换:当发生以下情况时用户模式向内核模式切换
用户模式向内核模式切换
当执行中断返回时内核模式向用户模式切换
内核模式向用户模式切换
Intel CPU的工作模式: 前面已经说了CPU的两种模式内核模式和用户模式,这是对一般通用CPU来说的,如ARM系列的处理器就划分这两种大的模式。绝大部分PC的CPU都是Intel公司的CPU,Intel的CPU经过多年的发展,已经发展成了现在的三种运行模式,分别是:实模式、保护模式,虚拟实模式。
实模式
Intel的8086到80186处理器都只有一种运行模式,这就是实模式。在这个模式下,CPU用20根地址线进行内存寻址,所以在这个模式下CPU只能访问从00000h~FFFFFh的地址范围的内存,即1M大小的内存。同时使用16根数据线,使用16位内部寄存器运行16位指令。由于使用的是16根数据线,为了能够支持使用20位的地址来访问1M的内存,于是就对内存的使用引入了分段机制。
为了支持分段机制,CPU设置了四个16位的段寄存器:CS、DS、SS、ES,分别是代码段,数据段,堆栈段和其他段,对应于地址总线中的高16位。寻址时,将段寄存器中的值向左移四位再加上段内偏移量就得到了物理地址。这样就实现了16位内存地址到20位物理地址的转换,这种方式叫做“映射”。由于其偏移量只能用16位来表示,所以其支持的段的大小只有64K字节
在实模式下,系统一次只能运行一个程序,其他程序都处于休眠状态。在这个模式下,任何一个程序都可以访问内存的任何地方,并没有一种保护机制来防止一个程序被另一个程序重写,即便是对于在内存中的操作系统也是如此。所以如果有几个程序存在内存中,很可能会因为其中的一个程序修改了另一个程序的数据而导致系统崩溃。
为了能够和前面的CPU兼容,80286及以后x86系列兼容处理器仍然是开机启动时工作在实模式下,这时的CPU和8086没有任何区别,只是运行速度比8086更快而已。然后通过操作系统设置之后就可以进入一个更加先进的模式——保护模式。
保护模式
要发挥80386及x86系列处理器的全部优势就要在保护模式下。那么保护模式和实模式到底有什么区别呢?首先是在保护模式下采用的是32根地址线和数据线,运行32位指令,可寻址高达4G字节的物理地址空间。实模式下只能寻址1M字节的物理地址空间。保护模式采用了虚拟内存,并采用分段和分页技术相结合的方式,其支持的最大的段的大小也从实模式的64K增长到4G。同时保护模式的地址转换方式也发生了变化。此时段寄存器里存的不再是基址,而是段选择子(后续文章再详细说明)。通过段选择子来选出段的描述符,描述符用来描述一个段,包含了段基址,段界限,段属性等段的信息。得到了段基址之后,再加上偏移量就得到了线性地址,与实模式最大的区别是保护模式的基址不要偏移。得到线性地址之后,如果禁止分页线性地址就被解释为物理地址;如果允许分页线性地址就通过页表映射到物理地址。
保护模式和实模式的最大区别是在保护模式下运行的软件程序受到了保护。这种保护作用首先体现在进程间的保护。在保护模式下每个进程都有自己的地址空间,然后把地址空间分页,得到许多的页面,再把这些页面映射到物理内存。由于不同进程的页表被映射到不同的物理内存,这就实现了进程间的相互隔离,防止一个程序被另一个程序重写,导致系统崩溃。同时进程间的隔离使得一个进程的崩溃也不会影响到其他进程的执行。
保护模式支持多任务运行,但这需要多任务操作系统来完成。操作系统让每个进程都得到部分的CPU时间,让它们轮流使用CPU,看起来就好像是多个任务在运行,实际上在很小的时间片段内还是只有一个程序运行,但在多核CPU中可以实现真正的并行运行。通过操作系统的设置,CPU可以从实模式进入保护模式,但是不能够倒退从保护模式进入实模式。
虚拟实模式(虚拟8086模式)
在当初设计Intel 80386CPU的时候,需要解决的一个难题是如何让运行在16位实模式下的程序能够在80386的保护模式中运行。为此Intel的设计人员在80386中加入了虚拟8086模式。在虚拟8086模式中,CPU把内存分成许多大小为1M的部分,每个部分分配给一个任务。大部分16位实模式下的程序能够不经任何修改的运行在保护模式下,每个程序都有属于他们的1M内存。微软在用虚拟8086模式来运行他们的DOS程序。运行Windows操作系统中的DOS提示窗口时,就建立了一个虚拟8086模式的会话。和真正的MS-DOS不一样,MS-DOS一次只能运行一个任务,其他任务都在睡眠,而在Windows中,每个任务都可以得到一个CPU的时间片段,所以许多任务都可以同时保持活跃,这是因为保护模式支持多任务。一个虚拟8086会话窗口完全模拟了一个8086环境,每一个虚拟机器都有其自己的1M字节地址空间、实际硬件BIOS程序的映像、所有各寄存器的仿真以及其他能在实模式中找到的特性,除了速度更快以外。
特权级
总共有4个特权级别,从高到低分别是0、1、2、3,数字越小表示的特权级别越大。如下图所示:最内Ring0特权级别最高,最外Ring3特权级别最低。
较为核心的代码和数据将被放在特权级较高的层级中。CPU用这样的机制来避免低特权级的任务在不被允许的情况下访问位于高特权级的段中。如果CPU检测到一个访问请求是不合法的,将会产生常规保护错误。有时候也将高特权级称为内层,低特权级称为外层。
特权级
CPL、DPL和RPL
(1) CPL (当前特权级)
CPL(Current Privilege Level)是当前执行的程序或任务的特权级。通常情况下,CPL代表代码所在的段的特权级。当程序转移到不同特权级的代码段时,处理器将改变CPL。只有0和3两个值,分别表示用户态和内核态。
(2) RPL (请求特权级)
RPL(Requested Privilege Level)是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。
(3) DPL (描述特权级)
DPL(Descriptor Privilege Level) 存储在段描述符中,规定访问该段的权限级别。每个段的DPL固定。当当前代码段试图访问一个段,DPL将会和CPL以及段选择子的RPL相比较,根据段类型的不同,DPL将会区别对待。
操作系统往往用RPL来避免低特权级应用程序访问高特权级段内的数据,即便提出访问请求的段有足够的特权级,如果RPL不够也是不行的,当RPL的值比CPL大的时候,RPL将起决定性作用。也就是说,RPL相当于附加的一个权限控制,只有当RPL>DPL的时候,才起到实际的限制作用。
硬件与操作系统对CPU的观察
硬件按“模式”来区分CPU的状态
操作系统按“进程”来区分CPU的状态