操作系统的启动
体系结构概念
CPU、I/O、内存-通过总线连接
操作系统一开始存放时没有放在内存里,而是当在DISK中,由BIOS提供相应支持
- DISK:存放OS
- BIOS:基本I/O处理系统(计算机开机时可以让系统检测各种外设,检测外设后才能检测各种软件并使其执行)
Bootloader:加载OS到内存中
BIOS从一个特定地址开始执行,当电脑通电时,段寄存器CS和指令寄存器IP能确定一个内存地址,如CS:IP=0xf000:fff0,(特定架构下有特定地址,X86下就是这个地址)
计算机通电之后,就会从这个地址开始执行,包括加电自检等,检测完成均正常工作后,会由Bootloader将OS加载到内存中去
POST(加电自检,检查自身设备是否能够正常工作),寻找显卡和执行BIOS(显示器、键盘等是否正常)
步骤
- 启动过程
中断、异常、系统调用
概念
- 系统调用(来源于应用程序):应用程序主动向操作系统发出服务请求
- 异常(来源于不良的应用程序):非法指令或其他坏的处理状态(如:内存出错)
- 中断(来源于外设):来自不同的硬件设备的计时器和网络的中断
三者的区别和特点
- 源头
- 中断:外设(注意不是CPU产生的)
- 异常:应用程序意想不到的行为(不是应用程序主动想产生的,而是在执行过程中意外产生的使计算机系统不能正常工作的指令,或操作系统截获的越权指令)
- 系统调用:应用程序请求操作提供服务
- 处理时间
- 中断:异步
- 异常:同步
- 系统调用:同步(发出请求是同步的)或异步(发出请求后返回的事件是异步的)
- 相应
- 中断:持续,对用户应用程序是透明的(打断了程序的正常执行,但是用户感受不到)
- 异常:杀死或重新执行意想不到的应用程序指令
- 系统调用:等待和持续
中断和异常的处理过程
中断
- 硬件:设置中断标记(CPU初始化)
- 将内部、外部事件设置中断标记
- 中断事件的ID
- 软件:
- 保存当前处理状态
- 中断服务程序处理
- 清除中断标记
- 恢复之前保存的处理状态
异常
发出异常后会有异常编号
- 保存现场
- 异常处理
- 杀死产生了异常的程序
- 重新执行异常指令
- 恢复现场
系统调用
应用程序需要操作系统提供的服务,而这个服务不能由应用程序直接来执行,必须要有操作系统来执行,这个过程就需要有一个接口,这个接口就是系统调用接口
- 一些系统调用的API
- Win32 API用于Windows
- POSIX API用于POSIX-based systems(包括UNIX、LINUX、Mac OS X的所有版本)
- Java API用于JAVA虚拟机(JVM)
通常情况下,系统掉有接口根据与每个系统调用相关的序号来维护表的索引
系统调用接口调用内核态中语气的系统调用并返回系统调用的状态和其他任何返回值
用户不需要知道系统调用是如何实现的,是需要获取API和了解操作系统将什么作为返回结果,OS接口的细节大部分都隐藏在API中
系统调用带来的开销比函数调用带来的开销大,但是也更安全
系统调用、中断、异常跨越了操作系统的边界,跨越边界就会有一定的代价,这个代价是为了让整个OS安全可靠正常的运行
- 跨越OS边界的开销
- 在执行时间上的开销超过程序调用
- 开销
- 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
- 建立内核堆栈
- 验证参数(OS不信任内核,要对内核发来的参数进行验证,这也需要一定的开销)
- 内核态映射到用户态的地址空间
更新页面映射权限 - 内核态独立地址空间
TLB