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

版权声明:版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lililuni/article/details/83626135

1:系统启动流程

启动流程
在这里插入图片描述
加载程序会按照下图的流程将控制权转给操作系统内核
在这里插入图片描述

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

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

  在计算机系统中,内核是被信任的第三方,可以在里面做对计算机系统里的任何内容的控制,而且可以执行它的特权指令。这种信任并不是指内核和外界隔离,它还需要为上面的应用程序提供服务。也就是说它必须对外界提供某种访问的接口或者打交道的通道。
2. 中断和异常解决的问题
- 解决当外设与系统有交互时的处理问题
- 应用程序执行碰到意外时,由异常来处理
3. 系统调用希望解决的问题
- 解决应用程序既能方便的调用系统服务,又不至于用户的行为影响内核的安全。
4. 内核的进入和退出
操作系统和外界打交道基本就是通过中断、异常、和系统调用这三个接口

内核的进入和退出共有3种情况
情况1:和外界硬件打交道
  在键盘敲入了一定数据后,必须通过中断通知内核,内核通知驱动来实现与设备进行数据交互。
情况2:代码执行出错
  比如说存储访问指令访问到某一个存储单元,但这个单元并不允许访问,这时候就需要异常处理机制,把控制权交给内核。
情况3:正常情况下
  应用程序会使用函数库,这时候和内核不打交道。但是内核、函数库、应用程序会间接的通过系统调用接口使用操作系统内核的服务。比如说应用程序需要读写数据到外部设备,应用程序通过系统调用接口所提供的函数进入内核,内核把相应的数据读出来返回给应用程序

在这里插入图片描述

2. 概念总结

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

区别比较
==图2==

3. 系统调用

  操作系统服务的编程接口,通常由高级语言编写(C或者C++) ,我们在写程序的时候,通常不直接使用系统调用,而是把系统调用封装到一个库里面,比如说标准c库,应用程序是通过访问这些库里的库函数来实现的。常见的应用编程接口:Java API 用于JAVA虚拟机,让虚拟机的应用程序间接的转到我的系统调用接口上。
  系统调用时,有堆栈切换和特权级的切换以保证内核正常,函数调用时,常规调用时没有堆栈切换。
  虽然系统调用比函数调用安全,但是系统调用比函数调用多了很多开销(主要是在内核态和用户态的切换上),一是切换的引导机制,二是第一次调用时会建立内核堆栈,三是验证参数。

猜你喜欢

转载自blog.csdn.net/lililuni/article/details/83626135
今日推荐