1. 操作系统的启动 异常和中断
启动:
OS的启动加载是通过一步步来执行实现的,主要涉及到 BIOS(基本I/O处理系统,检查外设硬件能否正常工作)、DISK(存放OS)、Bootloader(加载OS,能够让OS从硬盘加载到内存中去).
- 通电之后BIOS就会从一个特定的地址开始执行(CS:IP = 0xf0000:fff0 CS是段寄存器,IP是指令寄存器) ;
- 然后接下来会完成一系列操作,包括 加电自检(POST) ,自检是指检查一些硬件外设设备能否正常工作; 在自检完成后就会将bootloader从硬盘上加载进内存中去(bootloader的位置往往位于硬盘的第一个扇区,仅仅只有512个字节);
- 接下来CPU的控制权就交给了bootloader, bootloader最主要的一个功能就是将 OS 从硬盘上加载进内存,然后CPU的控制权交给OS , 接下来系统的管理就由OS来控制.
系统调用、中断、异常的概念及不同点:
- 系统调用(来源于应用程序)
- 应用程序主动向操作系统发出服务请求
- 异常(来源于不良的应用程序)
- 非法指令或者其它坏的处理状态(如内存出错)
- 中断(来源于外设)
- 来自不同的硬件设备的计时器和网络中断
三者的不同点:
为什么应用程序不能直接访问硬件而是通过操作系统?
-计算机运行时,内核是被信任的第三方。
-只有内核可以执行特权指令。
-为了方便应用程序。
中断和异常处理机制:
(1)中断处理:
分为硬件和软件,硬件方面外设首先会产生一个中断标记,当CPU检测到这个中断标记后会产生一个具体的中断ID,并且将该ID发送给操作系统,操作系统就能够根据具体的ID去操作;
软件方面需要打断当前正在运行的程序,那么就会保存当前的处理状态,然后去处理中断服务程序,处理完毕后清理中断标记,最后恢复之前保存的处理状态;
(2)异常处理:
异常处理过程和中断不一样,异常处理首先也会产生异常编号告知操作系统,操作系统会保存产生异常的指令的程序现场(比如当前指令的地址和寄存器的内容),然后进行异常处理,处理结果可能为杀死异常程序或者恢复现场后重新执行异常指令。
系统调用:
(1)程序访问主要是通过高层次的API接口而不是直接进行系统调用:
一条指令会触发一个系统调用;
-通常情况下,存在与每个系统调用相关的序号,系统调用接口根据这些序号来维护表的索引。
-系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其它任何返回值。
-用户不需要知道系统调用是如何实现的,只需要获取API和了解操作新系统将什么作为返回结果。操作系统接口的细节大部分都隐藏在API中,并通过运行程序支持的库来管理。
-用户态:应用程序在执行的过程中,CPU执行的特权级的状态(很低,不能访问特殊机器指令和IO)。
-内核态:应用程序在执行的过程中,CPU执行的特权级的状态(高,操作系统可以执行CPU任何一条指令)。
-系统调用时涉及到特权级从用户态到内核态的转换,应用程序和操作系统有各自的堆栈会涉及到堆栈的转变,这两个变化比函数调用的开销更大,但更安全和可靠。(而程序调用是在一个栈空间实现参数的调用和返回)。
(2)系统调用会涉及到跨越操作系统边界的开销:
在执行时间上系统调用会超过程序调用,这其中的开销包括 :①建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销;②建立内核堆栈(操作系统和应用程序的堆栈不一样);③验证参数(操作系统不信任应用程序会检查数据);④内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销);⑤内核态独立地址空间TLB
程序的堆栈不一样);③验证参数(操作系统不信任应用程序会检查数据);④内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销);⑤内核态独立地址空间TLB
标签:调用,操作系统,中断,系统,应用程序,内核,操作,第二章 From: https://www.cnblogs.com/istitches/p/17153123.html