操作系统的启动
DISK:存放os,bootloader程序
bootloader:一段执行程序,负责将os放入内存,硬盘第一个扇区,512字节
BIOS:基本IO处理系统,负责检测各种外设是否正常
POST:加电自检 寻找显卡和执行BIOS 初始化检查
启动过程:在计算机开机后,首先从BIOS首地址执行,在这个过程中会完成POST,并且将bootloader从磁盘的引导扇区加载到0x7c00,此时cpu控制权交给bootloader,它 将os的代码和数据从disk加载到内存,pc跳转到os的起始位置,开始执行。
os面向外设:中断 IO
os面向应用程序:系统调用 异常
概念
系统调用(来源于应用程序):应用程序主动向os发出服务请求
异常(来源不良的应用程序): 非法指令或者其他坏的处理状态(内存出错)
中断:(来源于外设) 来自不同的硬件设备的计时器和网络的中断
为什么应用程序不直接访问外设,而是经过OS?
1.OS内核可信任,应用程序不一定安全
2.内核可执行特权指令
3.为了方便应用程序,os能为应用程序提供统一接口,屏蔽底层复杂性和差异性,使应用程序简洁可移植
os如何设计和实现中断,异常和系统调用?区别 特点?
1.源头不同
中断:外设(敲击键盘)
异常:应用程序意想不到的行为
系统调用:应用程序请求os提供服务
2.处理时间
中断:异步(应用程序不知道什么时候产生)
异常:同步(明确知道什么时候产生)
系统调用:同步或异步(发出请求是同步的 返回点是异步的)应用程序发出后,就去做其他事情或在等待os,os完成后向应用程序发出消息。
3.响应
中断:持续,对用户应用程序透明的。
异常:杀死应用程序,重新执行意想不到的应用程序指令
系统调用:等待和持续
中断和异常处理机制
中断异常
应用程序产生一个中断,这个中断应该由哪个服务历程服务,为此需要建立中断表,表中有keys(编号)即中断号,每种中断有对应编号,特定编号有特定地址,此地址存的特定的服务程序。
中断会打断程序执行 ,所以需要 保存和恢复机制
中断和异常硬件和软件处理过程:
中断
硬件:设计中断标记(中断号)
软件:保存当前处理状态-> 中断服务程序处理-> 清除中断标记-> 恢复之前保存的处理状态
异常
硬件:异常编号
软件:保存现场-> 异常处理(杀死或重新执行)->恢复现场
系统调用:
例子:printf 调用write 参数:哪个设备 字符串内容
程序访问主要通过高层次的API而不是直接进行系统调用 如:Win32 API POSIX API Java API
用户态:cpu处于执行特权级很低,不能直接访问某些特殊机器指令和IO
内核态:os可以执行任何一条指令
系统调用过程:传递系统调用参数->转换状态(用户态->内核态)->执行相应服务程序->返回应用程序
函数调用与系统调用区别:
函数:函数调用与应用程序在一个栈空间
系统调用:应用程序和内核拥有各自的堆栈,系统调用时需要切换堆栈
系统调用需要切换状态 导致开销增大, 但更安全,必须开销 值得。