1、启动
计算机通电之后,计算机会首先进行POST(加电自检),包括寻找显卡和执行BIOS。之后由BIOS将BootLoader加载到内存之中,再有BootLoader将硬盘中的OS系统加载到内存之中,然后计算机的控制权力转移到OS系统手中。
2、操作系统与设备和程序交互
操作系统包含三个interfaces,分别是面向外设通过中断和I/O进行处理;面向应用程序通过系统调用和异常来提供相应的功能。
为什么应用程序不能直接来操作外设和计算机硬件?
首先处于安全的考虑,不是所有的应用程序都是可信任的,在计算机运行之中,内核是被信任的第三方,只有内核可以执行特权命令;另一方面是为了方便应用程序的开发,通过OS来屏蔽底层的复杂性。
2.1、系统调用
系统调用是指应用程序主动向操作系统发出的服务请求(system call),其来源于应用程序。
系统调用的源头是应用程序,处理时间是异步或者同步的,系统调用命令发出情况下其是同步的,但是接受OS返回的命令时,其可能是异步的;OS对系统调用的响应是等待服务完成之后再继续执行,等待和持续。
发生系统调用时,OS处理过程,OS接收到应用程序发出的系统调用指令之后,会传输指令到指定设备中执行指定的命令。基本的系统调用API包括WIN32 API用于windows和POSIX API用于POSIX-based systems,如Linux,UNIX,Mac OS等。Java API用于Java虚拟机,但其本质还是调用WIN32 API和POSIX API。
系统调用涉及到特权级的转换,由应用程序的“用户态”转换成OS的“内核态”。系统调用相对于函数调用有所区别,函数调用是在同一个堆栈空间之内进行,也不需要进行特权级的转换;而系统调用涉及到堆栈空间的转换,以为需要从应用程序申请的堆栈空间转换到OS系统函数所在的堆栈空间进行执行。从而系统调用相对于函数调用要消耗更多的资源,但是可以保证安全性和可靠性
跨越操作系统边界的开销?
♣在执行时间上的开销超过程序调用
♣开销
♣建立中断/异常/系统调用号与对应服务里程映射对应关系
表的初始化开销
♣建立内核堆栈
♣验证参数
♣内核态映射到用户态的地址空间,更新页面的映射关系
♣内核态独立的地址空间(TLB)
2.2、异常
异常指令或者其他坏的处理状态(如:内存出错等 ),其来源于不良的应用程序。异常的源头是应用程序,处理时间是同步的;OS对异常的响应是杀死或者重新执行意想不到的应用程序指令。
发生异常时,OS处理过程,首先需要保存现场,之后进行异常处理(杀死产生异常的程序或者重新执行异常指令),最后再恢复现场。
2.3、中断
来自不同硬件设备的计时器和网络的中断,其来源于外设。中断的源头是外设;处理时间是异步的;OS对于中断的响应是持续的,对用户应用程序是透明的。
发生中断时,硬件和软件的处理过程,对于硬件来说,其需要设置中断标记[CPU的初始化],将内部、外部事件设置中断标记,将中断时间的ID发送给OS,由OS来处理中断事件。对于软件OS来说,其需要保存当前处理状态,中断服务程序的处理,清除中断标记最后恢复程序之前的处理状态。