当前位置: 首页 > news >正文

【操作系统】 第二章 —— 系统调用 中断 异常

操作系统的启动

一、计算机体系结构概述

计算机原理上看分为三部分: CPU、内存 和 I/O
在这里插入图片描述
操作系统并不是直接存储到内存中,让CPU去执行

而是 通过DISK存储【硬盘】
利用BIOS来提供相应的支持【基本I/O处理系统,让OS能够检测计算机的各种外设】
BootLoader加载OS【让操作系统从硬盘中加载到内存中,使CPU可以执行操作系统】


二、计算机内存及硬盘布局

在计算机内存中,BIOS 已经预先占用一部分空间
在这里插入图片描述
(1)BIOS 第一步从一个特定的地址开始执行【CS:IP就是它的地址】

(2)第二步 寻找显卡和执行BIOS,检查自身的各种设备是否能正常工作【加电自检 POST
(3)第三步 把BootLoader从硬盘中放到内存中去


三、开机顺序

在这里插入图片描述
BIOSBootLoader从磁盘的引导扇区加载到0x7c00中之后,CPU的主导权就来到了BootLoader这里。

BootLoader将操作系统的代码和数据从硬盘加载到内存中,CPU跳到OS的起始地址,OS开始执行


中断 异常 系统调用

一、三者的定义

(1)系统调用:
应用程序 主动向操作系统发出服务的请求

(2)异常
应用程序 在执行过程中出现了一些意想不到的情况,只有由操作系统来处理

(3)中断
外设 需要操作系统提供特殊的支持,通过中断机制让操作系统感知到进而处理

  • 为什么应用程序不能直接访问外设?
    因为应用程序是不安全的,所以不能直接访问外设,要通过操作系统来访问;通过操作系统屏蔽底层的复杂性,通过提供相应的接口来提供底层服务【安全 便捷】

二、中断、异常和系统调用相比较

三者在操作系统中处理的过程:
在这里插入图片描述

  • 三者的源头不同:

中断: 源自外设利用中断机制发出的请求
异常:源自应用程序意想不到的行为
系统调用:源自应用程序请求操作系统提供服务

  • 三者的处理时间不同:

中断:异步 【发生中断的时间是不确定的】
异常:同步【当出现意外的情况,一定就会发生异常】
系统调用:异步或同步【从指令发出角度来说是同步的,从系统调用返回的角度来说是异步的】

  • 三者的相应方式不同

中断:持续的【对用户和应用程序透明】
异常:停止程序或重新执行
系统调用:等待和持续【发起调用后就要排队等待操作系统返回】

三、中断和异常处理机制

当产生一个中断或异常之后,要知道由哪个特定的服务例程来服务
在这里插入图片描述

通过表来记录,通过Key记录中断号、异常号
不同的外设产生不同的中断编号,每个编号对应特别的地址

操作系统收到中断,根据这个中断表,可以找到对应中断服务对应的起始地址,跳转执行

中断处理机制:通过软件与硬件来完成保存与恢复机制

  • 硬件

对外部内部事件设置中断标记【有了中断标记CPU才会识别到中断产生】
CPU在知道中断标记后,会产生一个中断号发给操作系统

  • 软件(操作系统)

保存被打断的执行现场【当前的处理状态】
根据CPU给的中断号查到对应进程的地址,去执行相应的操作
处理完之后,应该让当前被当断的程序继续被执行【恢复现场】

异常处理机制:

  • 保存现场
  • 异常处理
    ⭕️ 杀死产生异常的程序
    ⭕️重新执行异常指令 【操作系统根据知道的原因修复了产生的异常】
  • 恢复现场

四、系统调用

  • 程序访问主要是通过高层的API接口,而不是直接的系统调用
    在这里插入图片描述

  • 系统调用的实现
    (1) 通常情况下,每个系统调用都有相应的序号,系统调用接口根据这些序号来维护表的索引
    (2) 系统调用的接口,调用内核态中预期的系统调用,并返回系统调用的状态和其他任何返回值

  • 用户并不需要要系统调用是如何实现的

只需要获取API 和 了解操作系统将什么做为返回结果
将操作系统接口的大部分细节隐藏在API中,通过运行程序支持的库来管理

五、程序调用与系统调用的不同之处

当应用程序发出程序调用的时候,是在一个栈空间完成参数的传递、参数的返回

当应用程序发出系统调用时,这个应用程序和操作系统内核都有各自的堆栈,当发出系统调用,需要切换堆栈,同时需要完成用户态到内核态的转换,需要更大的开销【安全 可靠】

六、开销

对于中断、异常、系统调用都跨越了操作系统的边界,随之而来的是更大的开销

  • 在执行时间上的开销超过程序调用
  • 额外的开销体现在一下方面:

建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
建立内核堆栈
验证参数
内核态映射到用户态的地址空间,更新页面映射权限
内核态独立地址空间

相关文章:

  • 移动端测试
  • Cmake、Qt与VS编译VTK(生成QVTK)
  • Java——JDBC(Java DataBase Connectivity)数据库连接技术
  • Express
  • java学习之springcloud之服务调用+服务降级+服务网关篇
  • 常见的设计模式
  • 【我不熟悉的javascript】02. 使用token和refreshToken的管理用户登录状态
  • 备战秋招涵盖二十九大技术栈Java面试最新八股文来袭
  • tensorflow张量运算
  • 论文阅读笔记StyTr2: Image Style Transfer with Transformers
  • mybatis面试题及回答
  • 奔腾电力面试题
  • 【leetcode】905. 按奇偶排序数组 (简单)
  • Java--MybatisPlus入门;与Mybatis区别;简单使用(一)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • JS 中的深拷贝与浅拷贝
  • 【comparator, comparable】小总结
  • create-react-app做的留言板
  • Material Design
  • Otto开发初探——微服务依赖管理新利器
  • sessionStorage和localStorage
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Tornado学习笔记(1)
  • 从伪并行的 Python 多线程说起
  • 微服务入门【系列视频课程】
  • 因为阿里,他们成了“杭漂”
  • puppet连载22:define用法
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #13 yum、编译安装与sed命令的使用
  • (done) 两个矩阵 “相似” 是什么意思?
  • (补)B+树一些思想
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (力扣)1314.矩阵区域和
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)理解angular中的module和injector,即依赖注入
  • (转载)hibernate缓存
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net 8.0 新的变化
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 成都线下面基会拉开序幕
  • .NET 反射的使用
  • .NET开发不可不知、不可不用的辅助类(一)
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @Autowired和@Resource装配
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [100天算法】-实现 strStr()(day 52)
  • [20171102]视图v$session中process字段含义
  • [BJDCTF2020]The mystery of ip
  • [bzoj4240] 有趣的家庭菜园
  • [C#][DevPress]事件委托的使用
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强