一、 启动
计算机组成: cpu,内存,io
操作系统存放位置: 硬盘
BIOS:基本I/O处理系统,计算机启动时加载的第一个程序,在内存中,有一部分空间被BIOS占用,加电时会从特定地址执行,执行自检,将bootloader从硬盘中加载到内存中去(一般bootloader在磁盘第一个扇区)
Bootloader: 将OS从硬盘中加载到内存(找到操作系统硬盘所在扇区,将操作系统读到内存中去)
二、 中断、异常和系统调用
1. 定义
系统调用(来源于应用程序):应用程序主动向操作系统发出服务请求
异常(来源于不良的应用程序):非法指令或其他坏的处理状态(内存出错)
中断(来源于外设):来自不同的硬件设备的计时器和网络的中断
2. 设置中断、异常、系统调用原因
- 在计算机运行中,内核是被信任的第三方,应用程序不可信任
- 只有内核可以执行特权指令
- 为了方便应用程序,屏蔽底层硬件
3. 中断、异常、系统调用的区别
源头上看:
- 中断:外设
- 异常:应用程序意 向不到的行为
- 系统调用:应用程序请求操作提供服务
处理时间:
- 中断:异步(不知道什么时候产生)
- 异常:同步
- 系统调用:异步或同步
响应:
- 中断:持续、对用户应用程序透明
- 异常:杀死或者重新执行意想不到的应用程序指令
- 系统调用:等待和持续
4. 中断和异常处理机制
1) 中断处理过程
中断表:产生中断异常之后需要知道中断、异常由哪一个特定中断服务程序来处理,为此需要建立一个表,表的key为中断号,value为特定的地址,地址为针对特定中断服务程序
硬件处理流程:
设置中断标志[cpu初始化]
- 将内部、外部事件何止为中断标志
- 中断事件的ID,发送给操作系统
软件处理流程:
- 保存当前处理状态
- 找到对应的中断处理程序,执行
- 清除中断标志
- 恢复之前保存好的处理状态
2) 异常:异常编号
- 保存现场
- 异常处理(杀死异常程序或重新执行异常指令)
- 恢复现场
3)系统调用
例子:
a. 系统调用概述:
- 系统调用接口根据序号维护系统调用表索引
- 系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其他任何返回值
- 用户不需要知道系统调用是如何实现的,只需要获取api和返回参数
b. 系统调用流程:
应用程序直接或间接通过lib访问系统调用接口,触发用户态到内核态的转换
用户态:特权级别低,不能直接访问机器指令
内核态:特权级别高,可以执行特权指令
c. 系统调用和一般函数调用区别:
应用程序发出函数调用后,在一个栈空间完成函数之间参数传递和返回;而应用程序和内核拥有各自的堆栈,因此调用系统调用后,需要切换堆栈(系统调用开销比一般函数调用高)
d. 跨越操作系统边界的开销:
在执行时间上开销超过系统调用
开销:
- 建立中断/异常/系统调用号与对应服务程序映射关系的初始化开销(建立映射表)
- 操作系统需要维护的内核堆栈
- 操作系统不信任应用程序,接收到应用程序的调用请求后,会验证参数
- 操作系统处理完数据之后,可能需要将结果从内核态拷贝到用户态
- 应用程序执行可能会引起内存状态转变,tlb可能被刷新