天天看点

操作系统(2)-启动、中断、异常和系统调用

文章目录

    • 1:系统启动流程
    • 2:中断、异常和系统调用比较
      • 1. 为什么需要中断、异常和系统调用
      • 2. 概念总结
      • 3. 系统调用

1:系统启动流程

启动流程

操作系统(2)-启动、中断、异常和系统调用

加载程序会按照下图的流程将控制权转给操作系统内核

操作系统(2)-启动、中断、异常和系统调用

2:中断、异常和系统调用比较

1. 为什么需要中断、异常和系统调用

  在计算机系统中,内核是被信任的第三方,可以在里面做对计算机系统里的任何内容的控制,而且可以执行它的特权指令。这种信任并不是指内核和外界隔离,它还需要为上面的应用程序提供服务。也就是说它必须对外界提供某种访问的接口或者打交道的通道。

2. 中断和异常解决的问题

- 解决当外设与系统有交互时的处理问题

- 应用程序执行碰到意外时,由异常来处理

3. 系统调用希望解决的问题

- 解决应用程序既能方便的调用系统服务,又不至于用户的行为影响内核的安全。

4. 内核的进入和退出

操作系统和外界打交道基本就是通过中断、异常、和系统调用这三个接口

内核的进入和退出共有3种情况

情况1:和外界硬件打交道

  在键盘敲入了一定数据后,必须通过

中断

通知内核,内核通知驱动来实现与设备进行数据交互。

情况2:代码执行出错

  比如说存储访问指令访问到某一个存储单元,但这个单元并不允许访问,这时候就需要

异常处理机制

,把控制权交给内核。

情况3:正常情况下

  应用程序会使用函数库,这时候和内核不打交道。但是内核、函数库、应用程序会间接的通过

系统调用

接口使用操作系统内核的服务。比如说应用程序需要读写数据到外部设备,应用程序通过系统调用接口所提供的函数进入内核,内核把相应的数据读出来返回给应用程序
操作系统(2)-启动、中断、异常和系统调用

2. 概念总结

- 系统调用:应用程序主动向操作系统发出的服务请求  
- 异常:非法指令或者其他原因导致当前指令执行失败后的处理请求  
- 中断:来自硬件设备的处理请求  
           

区别比较

操作系统(2)-启动、中断、异常和系统调用

3. 系统调用

  操作系统服务的编程接口,通常由高级语言编写(C或者C++) ,我们在写程序的时候,通常不直接使用系统调用,而是把系统调用封装到一个库里面,比如说标准c库,应用程序是通过访问这些库里的库函数来实现的。常见的应用编程接口:

Java API 用于JAVA虚拟机,让虚拟机的应用程序间接的转到我的系统调用接口上。

  系统调用时,有堆栈切换和特权级的切换以保证内核正常,函数调用时,常规调用时没有堆栈切换。

  虽然系统调用比函数调用安全,但是系统调用比函数调用多了很多开销(主要是在内核态和用户态的切换上),一是切换的引导机制,二是第一次调用时会建立内核堆栈,三是验证参数。

继续阅读