# 一、概述
# 1.1定义
操作系统的作用在于:
- 管理应用程序
- 为应用程序提供服务
- 杀死应用程序
- 资源管理
- 管理外设/分配资源
操作系统在另一方面起到的是承上启下的作用,它是直接面向于硬件资源的
操作系统位于应用软件之下,为应用软件提供服务支撑
Linux,Windows,Android界面属于外壳shell,其作用是与User交互,而不是内核kernel,而kernel是研究重点,在shell之下
操作系统最主要的由三大块组成:CPU,内存,磁盘
# 1.2特征
- 并发(指一段时间内多个程序运行;而并行是指一个时间点上多个程序运行,要求多个CPU):计算机系统中同时存在多个运行的程序,需要OS管理和调度
- 共享:“同时”访问或互斥共享
- 虚拟:利用多道程序设计技术,让每一个用户都觉得有一个计算机专门为他服务
- 异步:程序的执行不是一步到底的,而是走走停停,向前推进的速度不可预知,但只要运行环境相同,OS要保证程序运行的结果也相同
# 二、操作系统启动
操作系统本身不是放在memory(内存)中的,而是存放在disk(硬盘),通过BIOS提供支持
BIOS的主要功能就是在计算机上电之后开始检测各种各样的外设(基本功能),检查完毕后加载相应的软件进行执行(除了OS之外还有一个bootloader),bootloader可以将OS从硬盘中加载到硬盘中
BIOS从一个特定地址开始执行,当电脑通电时,段寄存器CS和指令寄存器IP能够确定一个内存地址
完成以上操作之后计算机开始进行自检,自检没有出现后通过bootloader将OS放到内存中
# 三、操作系统与设备、程序交互
- 操作系统与设备进行交互时通过的是中断和IO进行处理的
- 操作系统与应用程序进行交互时通过系统调用和异常提供相应服务
# 3.1基本概念
系统调用:应用程序主动向操作系统发出的服务请求
异常:非法指令或者其他坏的处理状态,例如内存出错(来源于不良的应用程序)
中断:来自不同的硬件设备的计时器和网络中断(来源于外部设备),外设可以通过中断让操作系统感知到其对操作系统发出的请求
为什么应用程序不能直接访问外设?
- 计算机运行时,内核是被信任的第三方。
- 只有内核可以执行特权指令。
- 为了方便应用程序。
# 3.2来源
- 中断:外设(键盘/鼠标/网卡/声卡/显卡,可以产生各种事件)
- 异常:应用程序意想不到的行为(e.g.异常,恶意程序,应用程序需要的资源未得到满足)
- 系统调用:应用程序请求操作提供服务(e.g.打开/关闭/读写文件,发送网络包)
# 3.3处理时间
异步可以理解为这个操作不知道是什么时候产生的
- 中断:异步
- 异常:同步
- 系统调用:同步或异步
# 3.4响应
- 中断:持续,对用户应用程序时透明的
- 异常:杀死或者重新执行意想不到的应用程序指令
- 系统调用:等待和持续
# 四、中断和异常的处理过程
中断和异常的处理都需要软硬件结合进行处理才可以解决
计算机操作系统在发现出现了中断或者异常时会首先判断应该由哪一个特定的服务例程进行服务,为此需要建立好一个表,key表示的是中断号,每一个中断都会有一个特定的编号,其对应的地址就是处理该异常的特定例程
中断处理过程:
- 【硬件】设置中断标记,CPU可以根据这个标记产生一个中断号
- 【软件】保存被打断的现场(当前处理状态),根据中断号查询终端处理例程进行处理,清楚中断标记,处理完成之后恢复之前保存的处理状态
异常处理过程:
- 【软件】保存被打断的现场(当前处理状态),根据异常编号进行相应的处理
- 情况一:杀死产生异常的程序
- 情况二:进行弥补操作,然后重新执行异常指令
- 【软件】恢复现场
# 五、系统调用
- 通常情况下,存在于每个系统调用相关的序号,系统调用接口很举着些许好来维护表的索引
- 用户不需要知道系统调用是如何实现的,只需要获取API和操作系统将返回什么结果即可
- 操作系统接口的细节大部分都隐藏在了API中,并通过程序支持的库来进行管理
用户态和内核态
- 用户态:应用程序在执行过程中,CPU执行的特权级的状态(很低,不能访问特殊的机器指令和IO)
- 内核态:应用程序在执行过程中,CPU执行的特权级的状态(高,操作系统可以执行CPU中的任何一条指令)
- 系统调用时涉及到特权级从用户态到内核态的转换,应用程序和操作系统有各自的堆栈,这两个变化比函数调用的开销更大,但是更加安全可靠
# 六、跨越系统边界的开销
- 在执行时间上超过程序调用
- 开销包括:
- 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销;
- 建立内核堆栈(操作系统和应用程序的堆栈不一样);
- 验证参数(操作系统会检查数据);
- 内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销);
- 内核态独立地址空间TLB