2-1 操作系统的逻辑结构
逻辑结构
-
OS的设计和实现思路
逻辑结构的种类
- 1.整体结构
- 2.层次式结构
- 3.微内核结构(客户/服务器结构,Client/Server)
操作系统作为一个大型软件,它的设计逻辑实现的思路,我们叫做操作系统的逻辑结构,操作系统采用什么模式来设计 的,采用什么架构来实现的,我们把这样的内容叫做操作系统的逻辑结构。
操作系统的逻辑结构有三种整体式结构、层次式结构、微内核结构。微内核结构也叫客户/服务器结构,Client/Server结构。
1.整体式结构
以模块为基本单位构建
整体式结构的基本特点就是以模块为基本单位构建。这样的操作系统内部由很多模块构成,模块化的构造思想是我们在C语言,JAVA语言最基本的一种编程思想,以为模块化的方式编写程序。上图的C语言是由每个模块每个函数构成的。
这是以模块方式构建的操作系统,这也是操作系统由多个内部模块构成。这是操作系统提供的接口,最上面是应用程序。
1.整体式结构
特点
- 模块设计、编码和调适独立
- 模块调用自由
- 模块通信多以全局变量形式完成
缺点
采用整体式的结构来设计操作系统有什么特点呢?每个模块的设计、编码、调适相互独立,来设计不同的模块来做一个并行的开发。可以使模块的调用非常的自由,模块的通信多以全局变量形式完成模块间的通信,整体式结构的缺点,信息的传递非常的随意,系统的维护和更新非常的困难。
对于一个小系统来说 平常做一些规模比较小的应用开发,我们使用模块化的设计,事后应该没什么问题,但是对于操作系统这个大型复杂功能庞大的软件使用整体式结构使用模块化的方式设计就会存在这样的问题,模块之间的调用关系很难维护,很难理清楚,模块间信息共享让全局变量形式实现,我们都不容易控制,这个全局变量的读写过程很难控制,所以采用整体式结构并不是一个很好的方法来设计操作系统。
2.层次结构
层次结构的软件例子:TCP/IP协议栈
第二种逻辑结构就是层次结构,最典型层次结构的软件就是TCP/IP协议栈,这是一个典型的层次结构软件。
最顶层是上层的应用协议,划分一层一层所以是分层结构的软件。
分层结构的操作系统
我们也可以采用分层的形式来设计,上图是一个分层结构的操作系统。裸机是最底层的硬件,硬件上面是进程控制、进程通信,处理机的分派还有初级的中断管理,再往上是内存的管理,再往上是输入输出的管理、文件存取、资源分配与调度。
这个分层结构的操作系统越往底层和硬件结合越紧密,越往上层和用户功能结合越紧密,所有的功能模块按照调用的次序,排成若干层,相邻层只有单向的依赖或单向调用。每一层的实现是依赖下一层,每一层为它的上一层提供服务,层与层之间只存在单向的依赖和单向的调度。
分层原则
- 硬件相关 – 最底层
- 外部特性 --最外层
- 中间层 – 调用次序或消息传递顺序
- 共性的服务 – 较低层
- 活跃功能 --较低层
分层的原则和硬件相关的放在最低层,和外部特性和用户的需求有关的放在最外层比如最上层,中间层按照调用次序或消息传递顺序来安排,和共性服务有关的放在较底层,和活跃功能相关的放在较底层。这是分层的原则。
层次结构的优点
- 结构清晰,避免循环调用。
- 整体问题局部化,系统正确性容易得到保证。
- 有利于操作系统的维护、扩充、移植。
层次操作系统它的优点结构清晰避免循环调用;对整体问题局部化,系统的正确性容易得到保证,分层开发有利于操作系统维护、扩充和移植。
对于移植来说,换到一个新的操作系统里面还可以正常工作只需要修改最底层和硬件相关这一层,就可以方便移植到新的操作系统下面。
3. 微内核结构
操作系统 = 微内核 + 核外服务器
微内核
-
足够小,提供OS最基本的核心功能
-
1.实现与硬件紧密相关的处理
-
2.实现一些较基本的功能;
-
3.负责客户和服务器间的通信
核外服务器
-
完成OS的绝大部分服务功能,等待应用程序提出请求
- 由若干服务器或进程共同构成
- 例如:进程/线程服务器、虚存服务器,设备管理服务器等,以进程形式运行在用户态。
第三种逻辑 结构就是微内核结构,对于微内核结构的操作系统来说,操作系统由两部分构成 微内核加上核外服务器。
微内核 和核外服务器 分别担任什么工作有什么样的特点呢?
对于微内核来说,他的系统足够小,提供操作系统最基本的核心功能和服务,非常小
而核外服务器完成操作系统绝大部分服务功能,等待应用程序提出服务请求。对于核外服务器来说 它是直接面向应用面向用户的,而微内核这部分非常小,它只负责最底层的、最核心的、最活跃的功能和服务。
微内核主要实现这三方面的工作,实现与硬件紧密相关的处理;实现一些比较基本的功能;负责客户和服务器间的通信。
核外服务器是操作系统绝大部分功能,它由若干个服务进程构成,由若干个服务器或进程共同构成,
比如说进程服务器,线程服务器,虚存服务器,设备管理服务器等待,以进程的形式运行在用户态。
以微内核的架构来设计操作系统,它的优点在于非常方便的扩充操作系统功能,我们有新的功能要扩充只需要在核外服务器上面加一个新的进程。
Linux操作系统它是一个典型的单体内核。另外一个操作系统Minix OS 它是由Andrew设计的是一个典型的微内核结构。操作系统的代码4000行,可以通过小型的操作系统来理解操作系统的原理。
2-2 CPU的态
支持操作系统的最基本硬件结构
CPU
内存
中断
时钟
在计算机里面有一些最基本硬件是操作系统必须要依赖的,CPU、内存、中断、时钟。这四个基本硬件是操作系统最基本的硬件。
CPU 态(Mode)
CPU是计算机最重要的硬件,我们买计算机首先会先选择计算机的参数,CPU的作用就是用来运算,对指令进行解码和执行,CPU有一个概念叫做态,英文叫Mode。态顾名思义是CPU的工作状态,这个态也是对资源和指令使用权限的描述,程序能够使用计算机的哪些资源,能够使用哪些指令,与CPU的态有关系,CPU在不同功能状态下面能够使用的资源和指令是不一样的。
比如在计算机里面有上述这些指令,这些指令对计算机非常的重要,对计算机的一些核心的操作都受这些指令的控制,一些底层的核心的控制都与这些指令有关系。这些指令就不能随便被一些应用程序使用。
我们把上图的指令叫做特权指令,只有CPU工作在某一种权限很高的态下面,才能够使用这些特权指令,我们再回到态的概念,态是对资源和指令使用权限的描述。
态的分类
核态(Kernel mode)
-
能够访问所有资源和执行所有指令
-
管理程序/OS内核
态可以分为核态Kernel mode 能够使用所谓的资源和所谓的指令,包括我们刚刚讲的特权指令,核态是权限最高的,管理程序和操作系统内核都工作在核态上面。
用户态(User mode,目态)
第二种态叫用户态(User Mode)有时候我们也叫做目态。
这种态只能使用一部分资源,使用其它资源会受限,用户程序工作在用户态,用户态的权限是非常低的。
管态(Supervisor mode)
介于核态和用户态之间
管态势介于核态和用户态之间的,管态到底能使用哪一些资源哪一些指令,这个在不同的操作系统里面没有很明确的界限,所以我们主要分析核态和用户态,管态是中间的模凌两可的状态有时候可以不去细究它。
用户态和核态之间的转换
用户态向核态转换
- 用户请求OS提供服务
- 发生中断
- 用户进程产生错误(内部中断)
- 用户态企图执行特权指令
核态向用户转换的情形
用户态和核态这两种态可以相互转换,用户态向核态转换的情形,比如用户请求操作系统提供服务时要进入核态,发生中断这个响应过程是在核态完成的,这个时候会用户态进入到核态下面,用户进程产生错误或者用户态企图执行特权指令,这都会使CPU从用户态转向核态。
核态向用户态转换的情形一般是中断返回。
硬件和OS对CPU的观察
-
硬件按“态”来区分CPU的状态
-
OS按“进程”来区分CPU的状态
硬件和操作系统对CPU的观察,硬件按照“态”来区分CPU的状态,硬件会观察CPU是核态还是用户态。
对操作系统来说会按照进程的概念来区分CPU的状态,对操作系统来说CPU当前运行的是哪一个进程,是进程A还是进程B还是进程C,所以对于操作系统来说,它区分CPU的状态是看CPU现在在运行哪一个进程。
Inter CPU 的 态
Ring 0 ~Ring 3 (Ring 0 最核心,Ring 3最外层)
程序段A访问程序段B时进行权限检查(态)
程序段:请求特权级,RPL
描述符特权级,DPL
在不同类型的CPU上面实现这个态,支持这个态,他的定义是不相同的,比如在Inter的CPU里面,CPU支持者四个态,这四个态分别叫做Ring 0 ,Ring 1,Ring 2,Ring 3,Ring 就是环的意思,我们看上图图中有四个环,最外面的环是Ring3,最里面的环权限最高,最外面的环权限最低。
一段程序A假如它要访问程序B,这个时候要进行权限的检查,这个就是CPU态的转换过程。对于每一个程序段来说 它有一个请求特权级,RPL。RPL描述了这个程序段的属性。每一个程序段,它有一个描述符的特权级叫DPL。两个程序段要进行访问,一个程序段要去访问另外一个程序段,它们回去比较它们的DPL和RPL。这本身就是一个态的变换过程。
在Windows里面也提供了Ring0和Ring3之间通信的接口,Ring3层是应用层不能直接去访问设备的数据,它必须通过操作系统的代劳,操作系统工作在Ring0 上,Windows里面提供了DeviceIoControl这个函数可以让应用程序去访问设备的数据,上图代码是函数的原型,HANDLE hDevice 是要访问的设备,IplnBuffer是Ring3层的输入参数。应用程序输入参数的长度 nlnBufferSize是应用程序输入参数的长度,应用程序输入这样子的参数之后,操作系统在内层在Ring0层继续访问设备,把设备相应的状态和数据带回来给应用程序,IpOutBuffer这也是Ring0层返回来的参数 nOutBufferSize的长度。
这是Windows里面提供了这样一个接口来实现Ring0和Ring3之间的通信。
存储器
存储程序和数据的部件
分类
按存储器(半导体存储器)读写工作方式
按存储元的材料
- 半导体存储器(常作主存)
- 磁存储器(磁带,磁盘)
- 光存储器(光盘)
存储器是用来存储数据的部件。
存储器可以按照不同的标准来分类,按照存储器的读写工作方式可以分为RAM和ROM,按照存储元的材料可以分为半导体存储器、磁盘、磁带还有光盘。
我们也可以按照与CPU的联系分为主存和辅存,主存是内存,辅存是外存比方说硬盘,主存和辅存的区分主要看能不能与CPU直接交换信息,也就是看存储设备有没有与CPU直接连接地址总线 数据总线和控制总线,主存是可以直接和CPU和三种主线直接相连的,辅存不可以和CPU直接交换信息。
存储体系
理想存储体系:速度快,容量大,成本低
实际存储体系
分级存储系统的工作原理
CPU读取指令或数据时的访问顺序
1.访问缓存(命中,HIT)
2.访问内存(没有命中,MISS)
3.访问辅存(缺页,PAGE_FAULT)
实际的存储体系他的工作原理。
首先CPU直接去访问高速缓存,如果CPU要访问的内容在高速缓存里面我们就叫命中,但是不是每一次都那么幸运,CPU访问的内存数据都在高速缓存里面有时候也会不在,那就是CPU没有命中,没有命中的话CPU就到主存里面去访问,主存里面也不一定会有CPU要访问的数据,这个时候就会产生所谓的缺页错误,发生缺页的话,操作系统就会从辅存上面把所缺的内容所缺的数据调到主存上面,再通过途径进入到CPU里面去。
2-3 中断机制
中断的定义
- 是指CPU对突发的外部事件的反应过程或机制
- CPU受到外部信号(中断信号)后,停止当前工作,转去处理该外部事件,处理完毕后回到原来工作的中断处(断点)继续原来的工作。
中断机制是计算机系统 非常基础的工作机制,在六十年代中期,在计算机领域出现了两大新技术,其中之一就是中断,中断的定义式CPU对突发事件的外部事件的反应过程或机制。
我们叫中断处叫做断点。处理完外部事件以后,CPU又回到原来中断处继续原来的工作。这样一种机制我们叫做中断。
CPU正在执行主程序,突然这个时候有个外部事件发生了,这个外部事件可能是有个外设,有一个信号产生,比如键盘、按键的操作。或者鼠标有一个操纵,总之一个外部事件产生了,CPU中断主程序的工作,进入到中断服务程序,中断服务程序是事先已经准备好的 ,专门用来处理外部事件的程序,这个已经事先就准备好了,CPU主程序工作就进入到中断服务程序里面,当中断服务程序运行完以后,CPU为这个外部事件服务完以后又回到了原来的断点,继续向下运行。这一种机制我们叫做中断。
CPU执行中断服务程序完回到断点叫中断返回。
引入中断的目的:
- 实现并发活动
- 实现实时处理
-
故障自动处理
引入中断的目的实现并发活;实现实时处理;实现故障自动处理。
为什么可以实现并发活动呢?我们可以让CPU和外设并发,当外设工作完以后,我们可以让外设产生一个信号通知CPU去处理外部事件,如果没有中断机制的话我们就没办法让CPU和外设并行工作。我们也可以让两个进程并发,让两个程序并发运行,通过时钟的切换,然两个程序并发的使用CPU,时钟会产生中断信号,通知CPU让CPU的使用权切换到另外一个程序运行,再一个实现实时处理,实现故障自动处理都可以让终端机制来完成。
中断的一些概念
中断源和中断类型
- 引起系统中断的事件称为中断源
-
中断类型
-
强迫性中断和自愿中断
- 强迫性中断:程序没有预期:例:I/O、外部中断
- 自愿中断:程序有预期的。例:执行访管指令
引起系统中断的事件称为中断源是什么原因引起了中断是什么设备引发了中断,我们称为中断源。
中断可以分为强迫性中断和自愿中断,所谓的强迫性中断是指程序没有预期,CPU并不知道这个程序什么时候发生,程序、程序员也没有预期这个中断什么时候会来临,这种中断叫做强迫性中断,比如说IO操作,外设在进行输入或输出,那外设会在什么时候进行输入和输出呢这个程序员不会提前预期,还有外设什么时候会发生异常这都是强迫性中断。
自愿中断就是程序员有预期的,程序员在程序里面刻意的,刻意安排了一条中断指令,程序员有预期的这叫自愿中断,访管指令就是这样的中断。
访管指令是一条中断指令,用来访问内核。
中断类型
外中断(中断)和内中断(俘获)
- 外中断:由CPU外部事件引起,例:I/O,外部事情。
-
内中断:由CPU内部事件引起。例:访问中断、程序中断
外中断叫做中断,内中断叫做俘获,外中断指的是由CPU外部事件引起比如说I/O操作以及外设引发的事件。
内中断是由CPU内部事件引起的,比如说访管中断,访管中断是程序员安排的指令,再一个就是程序中断由程序内部出错。
外中断:不可屏蔽中断和可屏蔽中断
- 不可屏蔽中断:中断的原因很紧要,CPU必须响应
-
可屏蔽中断:中断原因不很紧要,CPU可以不响应
对外中断来说还可以分为不可屏蔽中断和可屏蔽中断,不可屏蔽的中断是因为中断的原因很紧要,CPU必须要响应。还有一些中断原因不是很紧要,CPU可以不响应,叫可屏蔽中断。
中断的一些概念
断点
- 程序中断的地方,将要执行的下一指令的地址
-
CS:IP
断点是指程序中断的地方,程序中断的地方我们往往用将要执行的下一指令的地址来表示这个参数。
现场
程序正确运行所依赖的信息集合
-
相关寄存器
现场也叫上下文指的是当前这个程序能够正确运行,它所依赖的信息集合,这个信息集合主要指的是CPU内部相关的寄存器。发生中断的时候,CPU当前的寄存器内容是什么,这个我们要记住。因为当前寄存器的内容是这个程序能够正确运行的一个最重要的参数。
现场的两个处理过程
-
现场的保护:进入中断服务程序之前,栈
- 现场的恢复:退出中断服务程序之后,栈
现场有两个处理过程一个是对现场的保护,在进入中断服务程序之前,我们要把当前程序的现场保护起来,保护在一个特殊的地方,栈里面,栈是一个特殊的内存,采用先进后出的方式来访问,对于现场的顺序我们要保护在栈里面,因为这个现场数据将来我们是要还原的,将来这个程序,这个被中断的程序,它要继续运行的时候我们要把它现场数据还原,在它被破坏之前要把它先存放在栈里面。另外一个操作就是现场的恢复,退出中断服务程序之后,我们就要把先前保护在栈里面的现场还原到CPU里面,还原的过程就是一个拓扑操作。把栈里面的数据都拓扑到寄存器里面还原现场。
中断响应的过程
- (1)识别中断源
- (2)保护断点和现场
- (3)装入中断服务程序的入口地址(CS:IP)
- (4)进入中断服务程序
- (5)恢复现场和断点
- (6)中断返回:IRET
中断响应的过程第一步发生中断,识别中断源,这是谁产生的中断,第二步就是保护断点和现场以便将来恢复,装入中断服务程序的入口地址(CS:IP),把中断服务程序的入口地址送入到CS:IP中,这个过程是由硬件完成的不需要程序员来干预。第四步就是进入到中断服务程序里面,CS:IP就会自动会进入到中央服务程序。在中央服务程序完成以后,恢复现场和断点准备运行主程序,第六步中断返回。IRET的指定就是会回到原来的主程序,IRET这个操作就会把这个断点弹出到(CS:IP)进程里面,只要CS:IP把它更新为原来的断点,那么久意味着原来的程序得以继续运行。
中断响应的实质
工作
中断响应的过程实际上就是交换指令执行地址的过程,在进入到中断服务程序之后CPU里面的CS:IP就发生了一个变换,交换了指令的执行地址。由原来主程序的地址转换到了中断服务程序的入口地址,另外一个是交换了CPU的态。中断响应的过程是在核态完成的,主程序在用户态交换了CPU的态。
中断响应的工作第一个是现场的保护和恢复,进入到中断服务程序,需要传递一些参数,中断服务程序完成之后呢 也有一些参数要返回给原来的主程序,所以还有一个参数的传递过程。