操作系统概述
一、什么是操作系统
1.1 定义
用户角度上(对上):为应用程序提供服务,是一个控制程序,能够管理应用程序,如:限制不同应用占用不同资源;为应用程序提供不同服务,如:IO服务、声卡网卡服务;
内部程序角度(对下):资源管理,管理外设、分配资源
1.2 功能
操作系统将CPU<——>进程,磁盘<——>文件,内存<——>地址空间,通过这种抽象(虚拟化)来给应用程序使用。
1.3 层次
操作系统为系统软件,直接面向硬件,给上面的程序提供服务接口。因此它的架层次结构在硬件之上,应用程序之下。
1.4 组成
操作系统层次的软件有两层,一层面向应用程序,称作Shell(外壳),另一层面向计算机内部资源,成为Kernel(内核),在Shell之下。Kernel — 操作系统内部组件包括,CPU调度器、物理内存管理、虚拟机内存管理、文件系统管理、中断处理和设备驱动
1.5 OS Kernel特征
并发:计算机系统中同时存在多个运行的程序,需要OS管理和调度
并发:在一段时间内有多个程序可以运行
并行:在一个时间点上有多个程序可以运行
共享:“同时”访问,互斥共享
虚拟:利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务
异步:程序的执行不是一贯到底,而是走走停停,向前推进的速度不可预知,但只要运行环境相同,OS需要保证程序运行的结果也要想同
二、操作系统的启动
2.1 启动涉及的基本程序
BIOS,在一块只读的内存,具有基本输入输出的程序、系统设置信息、开机自检程序、系统自启动程序等,主要功能是在计算机接通电源之后,能够让计算机系统能够开始检测各种外设;
Bootloader:加载OS,能够让OS从硬盘加载到内存中去,让CPU执行操作系统,一般在硬盘中第一个扇区,大小为512字节。
2.2 启动过程
电源启动 ——>CPU从固定地址开始执行BIOS(自检,若外设均能正常执行,就将BootLoader从硬盘的引导扇区加载到内存地址为0x7c00)——>跳转到BootLoader地址开始执(将OS代码和数据从硬盘中读到内存中)——>跳转到操作系统的起始地址(计算机管理就交给操作系统了)
2.2.1 CPU初始化
CPU加电稳定后从0XFFFF0读第一条指令;
CPU初状态是16位实模式;
注:0XFFFF0计算方式:CS:IP是16位寄存器,最大地址空间是1MB,此时地址计算是PC = 16*CS+IP,即CS左移四位,加上当前指令指针,此时最大地址空间是 1MB(2^20)。CS(代码段寄存器) :IP(指令指针寄存器)=0Xf000:fff0;第一条指令是跳转指令,跳转到BIOS执行
2.2.2 BIOS执行过程
BIOS初始化硬件——>(主引导扇区)BIOS读取主引导扇区代码(主引导记录:一台计算机,这里一个磁盘或硬盘会进行分区,而不同的区可能装不同操作系统。因此在这里加上主引导记录,这个记录的作用是表示要从哪个文件系统去读加载程序)——>(活动分区)主引导扇区代码读取活动分区的引导扇区代码(通过主引导记录进入分区后,分区中又有一个引导扇区,执行这个引导扇区的代码)——>(加载程序)通过引导扇区代码读取文件系统的加载程序
BIOS初始化:
硬件自检POST;
检测系统中内存和显卡等关键部件的存在和工作状态;
查找并执行显卡等接口卡的BIOS,进行设备初始化;
执行系统BIOS,进行系统检测;
更新CMOS中的扩展系统配置数据ESCD;
按指定启动顺序从软盘、硬盘或光驱启动;
主引导记录MBR格式:
启动代码(446字节):检查分区表正确性;加载并跳转到磁盘上的引导程序
硬盘分区表(64字节):描述分区状态和位置;每个分区描述信息占据16字节
结束标志字(2字节):55AA,主引导记录的有效标志;
分区引导扇区格式:
跳转指令:跳转到启动代码
文件卷头:文件系统描述信息
启动代码:跳转到加载程序(这段代码在硬盘上的,可改的,因此可以将OS数据放在任何扇区)
结束标志:55AA
2.2.3 加载程序BootLoader
从文件系统中读取启动配置信息(加载程序)——>可选的操作系统内核列表和加载参数(启动菜单)——>依据配置加载指定内核并跳转到内核执行(操作系统内核)
2.3 系统启动规范
BIOS规范:固化到计算机主板上的程序;包括系统设置、自检程序和系统自启动程序;BIOS-MBR、BIOS-CPT(全局唯一标识分区表)BIOS硬盘分区表只有64字节只能描述4个分区,而通过全局分区表就能描述更多的分区、PXE(网络启动标准)
UEFI规范:接口标准;在所有平台上一直的操作系统启动服务
问题:这里为什么BIOS不直接将操作系统内核读入内存,而是将加载器读入内存?
首先磁盘上有文件系统,文件系统是多种多样的。在机器出厂时,不能限制磁盘去只用某种文件系统,而BIOS不可能去识别支持所有文件系统程序。因此为了灵活性,就通过加载程序读OS。
三、中断、异常和系统调用
3.1 操作系统如何与设备和程序交互
其主要与操作系统的interface设计有关,面对外设,通过中断和IO进行处理;面对应用程序,通过系统调用,异常提供相应功能。
系统调用(来源于应用程序):应用程序主动向操作系统发出服务请求。需要操作系统提供服务支持;
异常(来源于不良的应用程序):非法指令或者其他坏的处理状况;
中断(来源于外设):来自不同的硬件设备的计时器和网络的中断;
3.2 设计原因
计算机系统启动后,会加载操作系统内核,操作系统内核是可以被信任的第三方;
只有内核可以执行特权指令;
方便应用程序;
3.3 中断、异常和系统调用解决的问题
中断:当通过外设输入指令时,系统可能正在进行其他操作,没办法进行相应。所以提供中断机制,当外设与系统有交互的时候,系统会通过此机制处理
异常:当程序(意外)出错时,将错误交给操作系统处理
系统调用:通过系统调用为用户提供相应接口,同时这些接口不会影响系统安全
内核的进入与退出:
3.4 响应方式
中断:异步
异常:同步(产生异常,处理异常)
系统调用:异步或同步(应用程序发出系统调用请求,如果程序一直等待内核反馈处理结果,就是同步;如果程序不等待结果去接着执行其他事,等内核返回结果后再回来获取结果,就是异步)
3.5 处理机制
中断:持续,对用户程序是透明的
异常:杀死或者重新执行意想不到的应用程序指令
系统调用:等待或持续
3.6 中断和异常处理机制(硬件和软件相结合)
当某个外设事件产生一个中断或内部事件产生一个异常,这时要知道是由哪个服务例程去处理这个中断或异常。它是通过中断向量表查询的(中断向量表是entry结构,一侧是中断号,异常号,不同事件编号不同,这些编号对应不同地址,这些地址就是处理中断或异常的服务例程的起始地址)
中断目的: 中断是为了打断CPU目前正在执行的程序,转而处理其他更紧急的程序。因此它有一个保护-恢复机制。
3.6.1 硬件处理
在CPU初始化时设置中断使能标志(在CPU未准备好之前,无法处理硬件设备的交互信息,所以需要设置CPU使能标志,表示CPU是否准备好);
依据内部或外部事件设置中断标志(外部设备或内部事件向CPU发出中断信号,CPU对事件标识,表示产生了异常或中断,由这个信号得到异常号或中断号);
依据中断向量调用相应中断服务例程 或异常处理例程;
3.6.2 软件处理
中断_软件处理:
保存当前处理状态;
执行中断服务例程处理;
清除中断标记(服务例程);
恢复之前保存的处理状态;
(由于保护-恢复机制,因此用户感受不到中断的产生)
异常_软件处理:
保存现场;
异常处理;
1、处理程序是杀死产生了异常的程序,退出执行
2、异常产生的原因操作系统可以弥补(如资源不够),处理程序是让操作系统进行弥补工作,然后恢复现场,这时就已经没有异常了
恢复现场;
3.7 系统调用
应用程序需要操作系统提供服务,这些服务,不能由程序直接执行,必须要操作系统执行,这时就需要操作系统提供相应接口,这些接口就是系统调用接口
用户态和内核态:它表示程序执行过程中,CPU所处于的一种状态。用户态特权级低,CPU不能直接访问某些特殊的机器指令和IO;内核态表示操作系统运行过程中,CPU处于的状态,此时CPU能访问任何一条指令。一个应用程序执行,会经过从用户态到内核态的反复转换。
3.8 系统调用和函数调用的区别
当应用程序发起函数调用的时候,其实是在一个栈空间完成了函数参数的传递和参数返回;但系统调用执行过程中,应用程序和操作系统内核实际拥有各自的堆栈。即当应用发出系统调用之后,切换到内核态执行,实际上是切换到操作系统的堆栈,同时也切换了特权级。这种切换需要一定开销,所以系统调用开销比函数调用大。
3.9操作系统带来的开销
操作系统通过中断、异常和系统调用,和应用程序以及外设进行交互,这种交互过程实际跨越了操作系统和外设,操作系统和应用程序的边界。这种跨越是有代价的,
在执行时间上的开销超过程序调用。其开销:
1、建立中断、异常、系统调用号与对应服务例程映射关系的初始化开销
2、建立内核堆栈
3、操作系统是不信任应用程序的,因此会对参数进行校验
4、内核态切换到用户态实际是内存的拷贝,会有开销。内核态映射到用户态的地址空间,更新页面映射权限
5、内核态独立地址空间
6、每次退出内核态,都会对当前状态进行保存,再次进入时又需要恢复