操作系统启动
- 操作系统一开始存放在DISK上
- DISK:存放OS
- BIOS:基本I/O处理系统
- 加电,POST(加点自检):寻找显卡和执行BIOS
- 接着,BIOS加载bootLoader,bootLoader一般放在硬盘的第一个扇区,把OS从硬盘放到内存中去
中断,异常和系统调用:
- 系统调用(来源于应用程序)
- 应用程序主动向操作系统发出服务请求
- 异常(来源于不良的应用程序)
- 非法指令或者其他坏的处理状态(如:内存出错)
- 中断(来源于外设)
- 来自不同的硬件设备的计时器和网络中断
源头:
- 中断:外设
- 异常:应用程序意想不到的行为
- 系统调用:应用程序请求操作提供的服务
处理时间
- 中断:异步(不知道什么时候会产生)
- 异常:同步
- 系统调用:异步(发出请求之后,返回的请求时异步的)或者同步
响应
- 中断:持续执行,对用户应用程序是透明的
- 异常:杀死或者重新执行意想不到的应用程序指令
- 系统调用:等待服务完成之后,继续持续执行
为什么外设要通过操作系统访问底层device呢,而不能直接访问?
- 在计算机运行中,内核是被信任的第三方
- 只有内核可以执行特权指令
- 为了方便应用程序
中断的处理机制:
- 由硬件完成
- 首先编号【CPU初始化】(中断号,每一个编号都对应一个具体的服务地址)
- 软件
- 保存当前的处理状态
- 中断服务程序处理
- 清除中断标记
- 恢复之前保存的处理状态
异常的处理机制
- 异常编号
- 异常处理(有两种方式)
- 杀死产生了异常的程序
- 重新执行异常命令(弥补修补后的指令)
- 恢复现场
系统调用
- 程序访问主要是通过高层次的api,而不是直接进行系统调用
- 通常情况下,于每个系统调用相关的序号
- 系统调用接口根据这些序号来维护表的索引
- 系统调用接口调用内核态中预期的系统调用
- 并返回系统调用的状态和其他任何返回值
- 用户不需要知道系统调用是如何实现的
- 用户调用操作系统时会完成用户态(级别低)到内核态(特权级别,可以控制整个操作系统)的转换,还要完成堆栈的转换
说明:Java 的大部分api不是—系统调用,没有调用到底层,只调用了虚拟机提供的服务,属于—程序调用
系统调用跨越操作系统边界的开销:
- 在执行时间上的开销超过程序调用
- 开销:
- 建立终端/异常/系统调用号于对应服务
- 建立内核堆栈
- 操作系统有自己的堆栈,不能和应用程序堆栈混为一谈,操作系统推出要把堆栈保存,执行的时候要把程序恢复,同理对应用程序也一样,有自己独立的堆栈
- 操作系统不信任应用程序调用,要验证参数,对应用程序的调用检查
- 处理完某些数据的时候有可能要把数据从内核态映射到用户态的地址空间(拷贝开销),更新页面映射权限
- 内核态独立地址空间TLB