【清华大学】操作系统 陈渝 Part2 —— 中断、异常和系统调用

2.1 操作系统的启动

启动

计算机启动原理:
在这里插入图片描述
DISK: 存放OS(操作系统开始是放在硬盘上的)

BIOS: 基本I/O处理系统(让计算机检查外设,加载相应软件执行程序),主要加载Bootloader

  • Bootloader: 主要加载OS
  • 从CS: IP = 0xf000:fff0 特定地址开始执行,完成外设自检工作(POST),寻找显卡(屏幕显示)和执行BIOS把Bootloader从硬盘放在内存中。
    在这里插入图片描述
    Bootloader一般放在硬盘第一个扇区(512字节),然后Bootloader把更复杂的软件OS从硬盘放进内存,那么,以X86为例,将Bootloader从磁盘的引导扇区加载到中0x7c00这个地址,向上512字节,就是Bootloader的代码和数据。Bootloader被加载到内存中以后,CPU的控制权就由Bootloader来掌握了。
    在这里插入图片描述
    Bootloader接下来找到硬盘中OS起始扇区和长度,然后把这段区域的磁盘块读到内存中,这就是Bootloader要完成的工作。CPU控制权现在交给了OS,现在计算机系统所有的硬件管理交给了操作系统。

在这里插入图片描述

操作系统与设备和程序交互

操作系统的interface:

  • 外设是通过中断和I/O来处理的
  • 应用程序是通过系统调用和异常来提供服务的

为什么应用程序不能直接访问外设,而要通过操作系统呢?
操作系统是一个特殊的软件,它不同于其他软件,它对整个计算机拥有控制权,它能够执行特权指令,是可信任的。而应用程序是不可信任的,有些恶意的应用程序会对整个系统造成破坏,操作系统可以提供一个安全的环境。从安全角度来看,防止整个系统崩溃;从另一个角度看,操作系统可以为上层应用一个统一接口,使得上层应用不用关心底层device细节,如果针对不同device来开发不同软件效率是很低的,所以希望操作系统可以屏蔽底层的复杂性与差异性,从而为上层提供一个非常简洁的接口,使得应用程序更加通用和可移植,所以应用程序不能直接访问外设。
总结一下就是:

  • 在计算机运行中,内核是被信任的第三方
  • 只有内核可以执行特权指令
  • 为了方便应用程序

系统调用

定义
来源于应用程序

  • 应用程序主动向操作系统发出服务请求,希望操作系统给予支持,即sysytem_call,理解为应用程序向操作系统发出一条指令,让操作系统来完成相应的功能。
    系统调用事件是应用程序主动发出的,比如打开文件,关闭文件,读写文件,发送网络包,系统调用都是由操作系统具体完成的,应用程序只需要按照定义好系统调用的接口,把接口的参数设置好,具体的实现由操作系统完成,应用程序得到返回结果以后继续做想做的。

处理时间
异步或同步:发出请求的点是同步的,返回的点可以是同步也可以是异步。

响应
等待服务完成和持续。

异常

定义
来源于不良的应用程序,应用程序在执行过程中出现了意想不到的情况,不得不让操作系统来完成相应的功能。

扫描二维码关注公众号,回复: 10858791 查看本文章
  • 非法指令或者其他坏的处理状态(如:内存出错)
    异常并不是应用程序主动想产生的事件,操作系统需要发现并且处理。

处理时间
同步事件:执行到特定某条指令后,一定会产生异常
响应
杀死或者重新执行意想不到的应用程序指令。

中断

定义
来源于外设,外设通过中断机制来让操作系统来处理,注意中断由外设产生而非CPU。
-来自不同的硬件设备的计时器和网络的中断
外设:鼠标,键盘,网卡,声卡,显卡,外设可以产生各种各样的事件,产生中断。

处理时间
异步事件:当事件产生的时候,应用程序并不知道什么时间产生。

响应
中断打断了当前应用程序的正常执行,但是应用程序并没有感觉到被打断,因为操作系统悄悄完成了整个过程,并没有去打扰应用程序。所以应用程序在过程中没有感受到中断,是连续的,中断对应用程序是透明的。

2.2 操作系统的中断,异常和系统调用

中断和异常处理机制

在这里插入图片描述
由硬件和软件共同完成。

硬件

设计中断标记

  1. 将内部、外部事件设置中断标记 【CPU初始化】(不同外设有不同的中断标号)
  2. 中断事件的ID (指程序访问的中断向量地址)

软件

  1. 保存当前处理状态
  2. 根据中断标号,中断服务程序处理
  3. 清除中断标记
  4. 恢复之前保存的处理状态(中断)
  • 异常:异常标号
  1. 保存现场
  2. 异常处理
  • 杀死产生了异常的程序
  • 重新执行异常指令
  1. 恢复现场

系统调用

系统调用来源于应用程序请求服务,这个服务由操作系统来执行。这个过程需要一个接口即系统调用接口。
在这里插入图片描述

在这里插入图片描述

  • 为了方便应用程序使用系统调用接口,程序访问主要是通过高层次的API接口而不是直接进行系统调用
  • 通常情况下,与每个系统调用相关的序号
    系统调用接口根据这些序号来维护表的索引
  • 系统调用接口调用内核态中预期的系统调用
    并返回系统调用的状态和其他任何返回值
  • 用户不需要知道系统调用是如何实现的
    只需要获取API和了解操作系统将什么作为返回结果;
    操作系统接口的细节大部分隐藏在API中

应用程序产生系统调用,操作系统从用户态转到内核态,从而控制权由应用程序交给操作系统。
应用程序产生系统调用和传统函数调用是不同的。当应用程序发生函数调用时是在一个栈空间内发生参数传递,结果返回。而在系统调用中,应用程序和操作系统内核拥有各自的堆栈,也就是说,从用户态转到内核态的同时,还要切换堆栈。这个过程都会产生开销。

小结

中断,异常,系统调用跨越了操作系统,应用程序和外设device的边界。跨越这个边界是为了系统安全可靠的运行,但是是有开销的

  • 在执行时间上的开销超过程序调用
  • 开销:
    1. 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
    2. 建立内核堆栈,维护堆栈开销
    3. 验证参数(操作系统不信用应用程序,安全检查时间开销)
    4. 内核态映射到用户态的地址空间(拷贝开销)
    5. 内核态独立地址空间
发布了45 篇原创文章 · 获赞 4 · 访问量 2518

猜你喜欢

转载自blog.csdn.net/keke_Memory/article/details/105000843