ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习记录2启动,中断、异常和系统调用

2022-09-09 22:00:18  阅读:127  来源: 互联网

标签:调用 操作系统 记录 中断 系统 应用程序 执行


启动

  • 计算机体系结构
  • 计算机内存和硬盘布局概述
  • 开机顺序
    开机之后操作系统启动,操作系统最开始存放的位置在硬盘(DISK:存放OS),
    再由BIOS(基本I/O处理系统)提供支持,开机后检测各种外设,而后加载相应的软件进行执行。BIOS会在内存中预先申领一个存储地址,这个地址就是“CS:IP”(CS:段寄存器,IP:指令寄存器),BIOS就从这个地址开始进行一系列的工作。首先是POST(加电自检,寻找显卡和执行BIOS),检查自身一系列设备是否能正常工作,比如,显示器、键盘鼠标、数据存储到地址等。Bootloader(512个字节)和OS都存放在硬盘,前者存放于硬盘第一个主引导扇区以便于BIOS寻找,然后BIOS再将Bootloader存放到内存中去,此时CPU控制权就由Bootloader掌握。
    Bootloader(功能)将OS的数据从硬盘读到内存中去,再将CPU控制权交给OS,使OS在内存中进行各种各样的工作,从前期的初始化工作到后期的创建各种各样程序进行运行,此时整个计算机系统硬件的管理都交由OS。
  • 操作系统与设备和程序交互(在完成启动正常工作之后)
    首先请出一个概念:hdb interface驱动是一个驱动程序。驱动程序全称为设备驱动程序,是一种可以使计算机和设备通信的特殊程序,相当于硬件的接口,OS操作系统只有通过这个接口,才能控制硬件设备的工作。驱动程序是一个允许高级电脑软件与硬件交互的程序,这种程序创建了一个硬件与硬件,或硬件与软件沟通的接口,经由主板上的总线或其它沟通子系统与硬件形成连接的机制,这样的机制使得硬件设备上的数据交换成为可能。
    interface(“接口”)面向外设,通过中断、IO来进行处理
    interface面向应用程序,通过系统调用、异常来提供相应功能

中断、异常和系统调用

背景知识

系统调用(system call,来源于应用程序)
是程序主动向操作系统发出服务请求(指令),希望得到服务系统的服务支持(完成特殊功能)
异常(exception,来源于不良应用程序)
是应用程序在执行过程中出现的意想不到的事情,使得操作系统不得不完成相应的功能
中断(interrupt,来源于外设)
当外设有些特殊的指令,需要操作系统完成特定的支持,通过中断机制使操作系统可以感知并进行处理的过程
为什么应用程序不直接去访问外设?

  • 内核是被信任的第三方 只有内核可以执行特权指令
  • 操作系统是款特殊的软件,对计算机有着控制权能够执行特殊指令
  • 恶意软件的直接访问会造成计算机系统的崩溃
  • 为了方便应用程序操作系统屏蔽底层设备的复杂性,为应用提供更简单、一致的接口,是的应用程序更加的通用和可移植

中断、异常和系统调用相比较,他们三者有什么区别和特点?

  • 源头

    • 中断:来源于外设(键盘鼠标网卡声卡显卡)
    • 异常:应用程序在执行过程中意想不到的行为(除0,恶意的程序要越过权限被操作系统截获,为程序提供运行所需的部分条件)
    • 系统调用:应用系统请求操作提供服务,有着明确的指令和参数(打开关闭读写文件,发送网络包,具体事项由操作系统完成)
  • 处理时间

    • 中断:异步(事件产生时程序不知道什时候会产生)
    • 异常:同步(一定是执行到某一条特定的指令时而产生)
    • 系统调用:异步或同步(发起点是同步,发出请求而后等待系统会亏结果,这样称之为同步;但发出请求后,程序并未亲自等待而是去执行别的事情,系统完成后会通知程序已完成,这就叫做异步)
  • 响应

    • 中断:打断应用程序的正常执行,但操作系统把该过程在后台执行了,是透明完成的,程序察觉不到
    • 异常:操作系统会将产生异常的应用程序程序杀死,或重新执行
    • 系统调用:等待和持续。操作系统等到请求,执行请求,而后继续执行下一个任务,不会重复执行

操作系统如何设计和实现中断、异常和系统调用?

设计
中断和异常处理机制(都是软件处理和硬件处理连在一起完成的)

  • 硬件
    • 设置中断标记[CPU初始化]
    • 将内部、外部事件设置中断标记
    • 中断事件的ID(中断号,操作系统根据中断号找到处理例程)
  • 软件(操作系统)
    • 包当前处理状态(保存被打断的执行现场,执行进度与寄存器内容,便于后来恢复时能够使程序从被打断点继续执行)
    • 中断服务程序处理(根据CPU提供的中断号,到相对应的处理历程执行外设发出的上文提到过的等等具体指令)
    • 清除中断标记
    • 恢复之前保存的处理状态(在程序不知情的情况下继续执行,这里的“不知情”理解为该程序没有向下执行)

异常(异常编号,CPU得到异常编号)

  • 保存现场(地址与存器内容)
  • 异常处理 杀死产生了异常的程序(操作系统在处理过程中决定让这个应用程序推出执行) 重新执行异常指令(操作系统认为是自身服务不到位)
  • 恢复现场
  • 系统调用(需要操作系统提供一些服务,但不能由操作系统直接执行,需要通过接口,操作系统再去提供服务)
    eg: 应用程序需要调用printf()时,会触发系统调用write(),write()会携带几个参数,比如输出的内容、由那个设备输出,操作系统获取参数后开始调用对应设备。这个过程有操作系统来完成,所以说应用程序只是来发出指令。通过操作系统和操作系统提供的接口,间接控制、管理计算机系统。
    为了便于程序能够使用操作系统的接口,有很多定义好的API
    • Win32 API(系统调用接口)用于Windows
    • POSIX APIyongyu-POSIX-based systems
    • JAVA API用于JAVA虚拟机(JVM)(这个API不是系统调用API,不过最后还是会通过操作系统的接口)
      系统调用的概念
      应用程序(APP)直接或通过Library Code来间接访问系统调用接口(System Interface),一旦访问之后会触发操作系统从用户态到内核态的转换(用户态是OS特权级的状态,这个特权级级别特别的低,不能够直接访问机器指令和IO系统;内核态,是OS在CPU中所处的特权态,这个状态下可以执行各种指令和访问IO系统),使得控制权从应用程序转换到操作系统上,操作系统向应用程序发出系统调用的参数,对系统调用的ID号进行标识,对系统调用完成具体的识别进而完成更多的指令。
      在这样的一个实现过程中,系统调用与函数调用有着一些很大的区别。应用程序进行系统调用切到内核时需要去切换堆栈,并且完成特权级的转换。这个过程需要一定的、并且大于函数调用的开销,回报就是安全可靠。

跨越系统操作边界的开销

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

这个过程需要一定的并且大于函数调用的开销,回报就是安全可靠。

开销

  • 在执行时间上的开销超过程序调用
  • 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销(各事件有相之对应的调用号,且调用号与之相对应的工作历程,需要提前列表)
  • 建立内核堆栈(操作系统与应用程序各有自己的堆栈,且两者不能混和,要有维护堆栈的开销,操作系统退出时把堆栈保存,执行时把堆栈恢复,应用程序也是)
  • 验证参数(操作系统对应用提供的数据进行检查)
  • 内核态映射到用户态的地址空间更新页面映射权限(内核态转换到用户态时,可能需要带走一部分数据,那么这个数据就要同过拷贝的方式)
  • 内核独立地址空间TLB

标签:调用,操作系统,记录,中断,系统,应用程序,执行
来源: https://www.cnblogs.com/hezhipeng/p/16672376.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有