本文涉及到两方面的内容,一是操作系统的启动,二是操作系统的中断、异常和系统调用。关于启动,需要知道操作系统是怎么从计算机加电后,启动到正常运行,然后最终能让应用程序正常开始它们各自的工作;关于中断、异常和系统调用,要了解操作系统是如何提供相应的接口来给应用程序提供服务,以及如何控制控制外设、与外设进行交互。

操作系统的启动过程

首先,我们要知道的是操作系统的代码是存储在硬盘中的,硬盘中除了OS代码外,还有一个叫做bootloader的代码段。

先看一张图:

bios有执行代码的能力吗 bios代码怎么看懂_bios有执行代码的能力吗

    上图中的BIOS是Basic Input Output System 的缩写,即基本输入输出系统。它是计算机ROM中的一段程序代码,计算机在开机时首先就要运行BIOS程序。BIOS从CS地址与IP地址组成的内存地址开始运行(以x86CPU为例),先是进行POST(加电自检)操作,即检查各种硬件设备是否正常工作。当检查完毕后,BIOS会将bootloader从磁盘的引导扇区加载到内存地址从0x7c00开始的512个字节中,此时CPU的控制权变成了由bootloader掌握,bootloader接下来会把OS的代码从硬盘读到内存中,而此时CPU的控制权则变成了由OS掌握,也就是说接下来要执行的是OS在内存中的起始地址中的指令。然后OS就可以在内存中进行必要的工作,如从前期的初始化工作,到后期创建各种应用程序,并让它们运行。至此,整个计算机系统的硬件都已经处于OS的管理之下。

下图简要说明了bootloader启动OS的过程:

bios有执行代码的能力吗 bios代码怎么看懂_操作系统启动_02

操作系统的中断、异常和系统调用简介

首先思考一个问题,操作系统如何与外设和程序交互?

答案就是利用操作系统的三个interface(我理解为特殊的接口或者说机制),即中断、异常和系统调用。操作系统利用中断(包括I/O)完成与外设的交互,利用系统调用和异常完成与应用程序的交互。系统调用、异常和中断三者的定义如下:

    1)系统调用(来源于应用程序):它是应用程序主动向操作系统发出的服务请求,目的是让操作系统提供相应的功能支持;

    2)异常(来源于不良的应用程序):它是一种非法指令或其他坏的处理状态(如内存出错);

    3)中断(来源于外设):它是指来自不同的硬件设备的计时器和网络的中断。

下面的一幅图简要说明了系统调用、异常和中断这三者在操作系统中的实现和处理过程:

bios有执行代码的能力吗 bios代码怎么看懂_bios有执行代码的能力吗_03

自然而然,我们会想到为什么应用程序不直接访问外设,而是要通过OS间接访问外设?

    基于如下两点原因:

    1)安全角度:OS比应用程序更加值得信任;

    2)应用接口角度:利用OS可以屏蔽底层器件的复杂性和差异性,从而给上层应用提供更加简洁的接口,使得应用程序可以写的更加通用,可移植性更强。

最后对中断、异常和系统调用这三者进行一个简单的比较:

    1)源头:中断来源于外设;异常来源于应用程序;系统调同样用来源于应用程序。

    2)响应方式:中断是异步响应;异常是同步响应;系统调用是异步或同步响应。

    3)处理机制:中断是持续的,对用户应用程序来说是透明的;异常是杀死或重新执行意想不到的应用程序指令;系统调用是等待和持续。

 

参考:

http://open.163.com/movie/2018/12/6/0/ME1NSA351_ME1NSM960.html

http://www.xuetangx.com/courses/course-v1:TsinghuaX+30240243X+sp/about

http://www.ruanyifeng.com/blog/2013/02/booting.html