学习记录2启动,中断、异常和系统调用
作者:互联网
启动
- 计算机体系结构
- 计算机内存和硬盘布局概述
- 开机顺序
开机之后操作系统启动,操作系统最开始存放的位置在硬盘(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