【操作系统2】操作系统启动过程与异常/中断,系统调用

操作系统启动过程

操作系统(OS)储存在硬盘(DISK)上的,然后由BIOS(基本IO处理系统)来提供相应的支持。BIOS的作用是按下电源,计算机开机后能进行功能检测,做完检测后才能加载相应的软件执行。

除了OS外还有一个很简单的小程序叫Bootlader,Bootlader主要功能用来加载OS,将OS从硬盘加载到内存中去。让CPU可以执行操作系统。Bootlader储存在硬盘上第一个主引导扇区(512字节)。

操作系统启动过程如下

  1. 通电
  2. 通电后,CPU默认从内存地址0XFFFF0开始执行指令。这个地址在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。
  3. BIOS会完成一系列的工作,包括POST(加电自检),检查计算机的各种设备是否能正常工作。
  4. 自检完毕后,BIOS负责将Bootlader从磁盘的引导扇区加载到内存0X07C00处。同时跳转到CS:IP=0000:7C00处。
  5. 执行Bootlader的代码,将操作系统的代码和数据从硬盘加载到内存中;再跳转到操作系统的起始地址。执行操作系统的代码。

操作系统如何与设备程序进行交互

操作系统主要通过中断与系统调用和设备进行交互。通过异常与系统调用和应用程序进行交互。

系统调用(来源于应用程序):应用程序主动向操作系统发出服务请求。
异常(来源于不良的应用程序):非法指令或其它花的处理状态(如:内存出错)。
中断(来源于外设):来自不同的硬件设备的计时器和网络的中断(如:)。

为什么应用程序不能直接访问硬件而是通过操作系统?

  • 操作系统是可信任的。并且程序直接访问硬件很容易出问题。
  • 为了方便应用程序。因为操作系统对上可提供统一的接口,这样就不用因为设备不同而开发不同的程序。

异常/中断,系统调用的区别

源头处理时间响应
中断外设异步持续,对用户应用程序是透明的
异常应用程序意想不到的行为同步杀死或者重新执行意想不到的应用程序指令
系统调用应用程序请求操作提供服务同步或异步等待和持续

中断的异步:指产生事件时,程序并不知道什么时候会产生。
异常的同步:指执行到某条指令时一定会产生事件,如除0。
系统调用的同步:比如操作系统读文件时,发出读的请求,等读完数据后才会去做其它事情。
系统调用的异步:操作系统读文件时,发出读的请求后不管是否读完数据,马上去做其它事情。

异常/中断,系统调用的处理过程

中断/异常的处理过程:
中断/异常的处理过程分为硬件的处理过程和软件的处理过程。两者合在一起才能完成一个正常的中断/异常的处理工作,过程如下:

当中断/异常发生后,首先需要知道中断/异常由哪个特定的例程来服务。为此操作系统内部需要建立一张KEY-VALUE的表。表的KEY是中断/异常的编号。建立表的原因是因为一旦标记好后就能区分出是硬盘中断还是鼠标中断又或者是键盘中断(中断是外设的事件,异常是CPU的事件)。不同外设产生出来的中断,它们的编号也不同。每个编号对应的都有一个地址,每个地址对应不同的服务例程,这样,当一个中断/异常产生后,就可以通过查找表来找到特定的地址。再跳转到特定的服务例程来处理。

为了让系统能完成更多的工作,除了上面所说的以外还需要完成更多的事情,因为当一个中断产生后,是打断了当前的正常执行,来处理一个更加紧急的来自外设的一个事件。既然打断了一个程序的执行,那么就需要做出一定的保护(保存与恢复机制),有了这个机制后,操作系统才能做完中断操作后,让程序继续运行。

中断处理时,硬件需要做的事:

  1. 设置中断标记(标记设置好,CPU才知道产生了一个中断事件,通过中断标记可以知道中断编号,把中断编号发给操作系统,由此可以得知具体的处理例程)

中断处理时,软件(操作系统)需要做的事:

  1. 保存被打断的执行现场。
  2. 中断服务程序处理(每个中断编号对应一个特定的服务例程)。
  3. 服务例程执行完毕,清除中断标记。
  4. 恢复之前保存的处理状态,让原来程序继续运行。

异常处理时,需要做的事:

  1. 保存现场
  2. 异常处理:杀死产生异常的程序,或重新执行异常指令
  3. 恢复现场

系统调用:
系统调用是指我们的应用程序需要操作系统来提供服务,而这个服务不能由应用程序来直接执行,必须要有操作系统来执行。那么这个过程就需要有一个接口,而这个接口就被我们称之为系统调用。而有了这个接口后,就可以由我们的操作系统来给应用程序提供各种各样的服务。

当产生一条系统调用时,会有一个从用户态转换到内核态的过程
-用户态:应用程序在执行的过程中,CPU执行的特权级的状态(很低,不能访问特殊机器指令和IO)。
-内核态:应用程序在执行的过程中,CPU执行的特权级的状态(高,操作系统可以执行CPU任何一条指令)。

系统调用和函数调用的区别:

  1. 因为应用程序和操作系统有各自的堆栈,所以发出一个函数调用时,它是在一个栈空间完成参数的传递与返回,同时它的整个运行过程都在用户态。但在系统调用的执行过程中,当它切换到内核后,堆栈会进行切换。同时还要完成从用户态到内核态的转换。

跨越操作系统边界的开销:

  1. 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
  2. 建立内核堆栈(操作系统和应用程序的堆栈不一样)
  3. 验证参数(操作系统不信任应用程序传递过来的参数,所以会检查数据)
  4. 内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销)
  5. 内核态独立地址空间TLB
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页