前言
✨本篇为博主 考研操作系统 的第三篇:1.3 操作系统运行环境
本篇博客内容来自:
👊2022王道视频笔记总结
👊2023王道书重点归纳总结
👊2023王道习题好题,错题总结
需要博主PDF版笔记或相关资料的同学可以评论出来,我会私发给大家~
笔记
本节所说的指令不是终端中输入的指令,指的是CPU能识别执行的最基本命令 (二进制机器指令)
CPU通常执行两种程序:操作系统的内核程序(简称内核,是操作系统的核心,是最接近硬件的部分);用户自编的程序(即操作系统外层应用程序,即“应用程序”);前者是后者的管理者,故内核程序需要执行一些特权指令,而应用程序则不可以执行这些指令。
一个操作系统其实只要有了内核就可以了,例如Docker—>仅Linux内核,操作系统的功能未必都在内核中,如图形化用户界面GUI。
特权指令:用户不可以直接使用,如I/O指令,置中断指令,存取用于内存保护的寄存器,送程序状态字到程序状态字寄存器等的指令。
非特权指令:允许用户直接使用的指令,不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间。
在CPU设计和生产的时候就划分好了特权指令和非特权指令。
CPU的运行模式划分为用户态(目态)和核心态(管态,内核态),在CPU内部有程序状态寄存器(PSW),其中有一个二进制位,当这个二进制位为0的时候,CPU处于核心态;当这个二进制位为1的时候,CPU处于用户态;当然这个二进制表示不是绝对的,即对于一些计算机1可能表示的是核心态,只需要知道用二进制就可以对CPU进行标记。
从用户态切换到核心态的指令是非特权指令,从核心态切换到用户态的指令是特权指令。
现代操作系统,几乎采取的都是分层式的结构,各项功能被设置在不同的层次上;与硬件联系紧密的模块(时钟管理,中断处理,设备驱动等)处于最底层;其次是运行频率较高的程序(进程管理,存储器管理,设备管理);以上两部分构成了操作系统的内核,这部分内容的指令操作工作在核心态。
内核是计算机上配置的底层软件,管理着操作系统的各种资源,是连接应用程序和硬件的一座桥梁,包含以下四部分内容:
1.时钟管理:时钟的第一功能是计时,给用户提供标准的系统时间;通过时钟中断的管理,可以实现进程的切换;系统管理的方方面面无不依赖于时钟。
2.中断机制:初衷:提高多道程序运行环境中CPU的利用率,主要是针对外部设备设计的;现在:成为了操作系统各项操作的基础;现代操作系统是靠中断驱动的软件。中断机制中,只有很少一部分功能属于内核,它们负责保护和恢复中断现场的信息,转移控制权到相关的处理程序,这样可以减少中断的处理时间,提高系统的并行处理能力。
3.原语:具有如下特点的公用小程序:
a.处于操作系统的最底层,是最接近硬件的部分;
b.运行具有原子性,操作必须一气呵成;
c.运行时间短,调用频繁;
定义原语的直接方法是关闭中断,让其所有动作不可分割地完成后再打开中断;系统中的设备驱动、CPU切换、进程通信等功能中的部分操作可以被定义为原语。
4.系统控制的数据结构及处理:系统重用来登记状态信息的数据结构很多,如:作业控制块,进程控制块(PCB),设备控制块,各类链表,消息队列,缓冲区,空闲区登记表,内存分配表等;为了实现有效管理,有如下基本操作:
a.进程管理:进程状态管理,进程调度和分配、创建与撤销进程控制块等;
b.存储器管理:存储器的空间分配和回收、内存信息保护程序、代码对换程序等;
c.设备管理:缓冲区管理、设备分配和回收等。
核心态指令实际上包括系统调用类指令和一些针对时钟、中断和原语的操作命令。
操作系统内核工作在核心态,用户程序工作在用户态;在核心态建立一些 “门”,使得可以从用户态进入核心态,在操作系统运行上层程序时唯一能进入这些 “门” 的途径就是通过中断或者异常;发生中断或者异常时,运行用户态的CPU会立即进入核心态,这是通过硬件实现的(比如上文中的PSW,只需要改变一个二进制位);操作系统的发展就是不断提高资源利用率的过程,这就需要在程序未使用某资源时释放该资源的占有权,这一行为就需要 中断。
中断也称外中断,是来自CPU执行指令外部的事件,通常用于信息输入/输出;如I/O中断表示输入/输出的完成;时钟中断[实现多道程序并发执行],表示一个固定的时间片已到。
异常也称内中断,是来自CPU执行指令内部的时间;如程序的非法操作码、地址越界、运算溢出、虚存系统的缺页及专门的陷入指令等引起的事件;异常不能被屏蔽,一旦出现,就应立即处理。
外中断可分为可屏蔽中断和不可屏蔽中断;可屏蔽中断是指通过INTR线发出的中断请求,通过改变屏蔽字可以实现多重中断,从而使得中断处理更加灵活;不可屏蔽中断是指通过NMI线发出的中断请求,通常是紧急的硬件故障,如电源掉电;再次强调,异常(内中断)是不可屏蔽的。
异常可分为故障、自陷和终止;故障通常是由指令执行引起的异常,如非法操作码、缺页故障、除数为0、运算溢出;自陷是一种事先安排的 “异常” 事件,用于在用户态下调用操作系统的内核程序,如条件陷阱指令;终止是出现了CPU无法继续执行的硬件故障,如控制器出错,存储器校验错等。
故障异常和自陷异常属于软件中断(程序性异常),终止异常和外部中断属于硬件中断。
中断和异常的处理过程:当CPU在执行程序的第i条指令时检测出一个异常事件,或在执行第i条指令后发现一个中断请求信号,则CPU打断当前的用户程序,然后转到相应的中断或异常处理程序去执行,如果可以解决,则在解决问题后CPU通过执行中断或异常的返回指令,回到被打断的用户程序的第i条指令或第i+1条指令继续执行,若是不可恢复的致命错误,则终止用户程序;通常情况下,对中断和异常的具体处理过程由操作系统(和驱动程序)完成。
中断(内中断和外中断)是让操作系统内核夺回CPU使用权的唯一途径,没有 “中断” 机制,那一个程序就会在CPU上一直运行,这就没有了所谓的 “并发”。
内核态 —> 用户态:执行一条特权指令:修改PSW的标志为用户态
用户态 —> 内核态:由 “中断” 引发,硬件自动变态,但凡需要操作系统介入的地方都会触发中断信号
内中断:与当前执行的指令有关,中断信号来自CPU内部;外中断:与当前指令无关,中断信号来源于CPU外部。
故障:由错误条件引起,可能被内核程序修复,修复后内核归还CPU,让程序继续执行下去。
自陷:陷入指令:应用程序请求系统内核服务(如系统调用),这是程序故意引发的,注:陷入指令是特殊指令,并非特权指令!!!
终止:是致命错误,内核无法修复,不会归还CPU,直接终止程序。
中断(内中断+外中断)机制的基本原理:不同的中断信号需要不同的中断程序处理,检测到中断信号后根据中断信号的类型去查询中断向量表[中断处理程序一定是内核程序,需要运行在内核态]。
系统调用:指用户在程序中调用操作系统所提供的一些子功能,系统调用可以视为特殊的公共子程序,系统中的各种共享资源都由操作系统统一掌管,凡是与资源有关的操作(存储分配、进行I/O传输、管理文件等),都必须通过系统调用的方式向操作系统提出服务请求,并由操作系统代之完成。
系统调用按功能可分为:
1.设备管理:完成设备的请求或释放、设备启动等功能
2.文件管理:完成文件的读、写、创建、删除等功能
3.进程控制:完成进程的创建、撤销、阻塞及唤醒等功能
4.进程通信:完成进程之间的消息传递或信号传递等功能
5.内存管理:完成内存的分配、回收、获取作业占用内存区大小及始址等功能
系统调用的处理需要由操作系统内核程序负责完成,要运行在核心态,用户程序可以执行陷入指令(又称访管指令或trap指令)发起系统调用。
系统调用与库函数:有的库函数是对系统调用的进一步封装,有的库函数没有使用系统调用(取绝对值函数)
传递系统调用参数—>执行陷入指令(用户态)—>执行相应的内核程序处理系统调用(核心态)—>返回应用程序
由用户态进入核心态,不仅状态需要切换,而且所用的堆栈也可能需要由用户堆栈切换为系统堆栈,但这个系统堆栈也是属于该进程的。
程序运行由用户态转到核心态,会用到访管指令,访管指令是用户态使用的,即访管指令不是特权指令;发出系统调用请求是在用户态,而对系统调用的相应处理是在核心态下进行的。
习题总结
通用操作系统使用时间片轮换调度算法,用户运行程序并不需要预先预定运行时间;操作系统执行程序时,必须从起始地址开始执行。
批处理的主要缺点是缺少交互性;多道性是为了提高系统利用率和吞吐量提出的;I/O通道实际上是一种特殊的处理器,它具有执行I/O指令的能力,并通过执行通道程序来控制I/O操作。
中断是操作系统必须提供的功能,因为计算机的各种错误都需要中断处理,核心态与用户态切换也需要中断处理。
中断处理流程的前三个步骤是由硬件直接实现(隐指令)的;地址映射中需要基地址(或页表)寄存器和地址加法器的支持;时钟管理中,需要硬件计数器保持时钟的运行;进程调度由调度算法决定CPU的使用权,由操作系统实现,不需要硬件的支持。
中断或异常发生时,通过硬件实现将运行在用户态的CPU立即转入核心态;中断发生时若被中断的是用户程序,则系统将从目态转入管态,在管态下进行中断的处理;若被中断的是低级中断,则仍然保持在管态;中断可以发生在管态(中断套中断);用户程序只能在目态下运行,因此进入中断处理的程序只能是OS程序;中断程序本身可能是用户程序,但是进入中断的处理程序一定是OS程序。
计算机通过硬件中断机制完成由用户态到核心态的转换,这是通过中断机制实现的,发生中断事件时(可能是用户程序发出的系统调用),触发中断,硬件中断机制将计算机状态置为核心态。
大部分操作系统内核分为:时钟管理、中断机制、原语和系统控制的数据结构及处理,第4部分实际上是系统调用类的指令(广义指令);读时钟指令、取数指令、寄存器清零的指令均可以在汇编语言中涉及,因此都可以运行在用户态;置时钟指令只能在核心态运行。
访管指令仅能在用户态下使用,执行访管指令可以将用户态转变为核心态。
运行操作系统代码的状态为核心态。
运行操作系统代码的状态为核心态。
广义指令即系统调用命令,必工作在核心态;广义指令的调用可能在用户态,调用广义指令的那条指令不一定是特权指令,但广义指令存在于核心态中,所以执行一定在核心态。
输入/输出指令涉及中断操作,中断处理是由系统内核负责的,工作在核心态;从内存中取数、将运算结果装入内存、算数运算均可以通过使用汇编语言编程实现,因此它们可在用户态下执行;操作系统管理内存时,管理的是内存中的数据放在哪里、哪里可以放数据、哪里不可以放数据(内存保护)、哪里空闲等问题,而内存中的数据是什么、怎么读和怎么写,都不是核心态关心的。
CPU处于核心态时,它可以执行的指令是:除“访管”指令的全部指令。
缺页处理和时钟中断都属于中断,在核心态下执行;进程调度是操作系统内核进程,无须用户干预,在核心态下执行;命令解释属于命令接口,是面对客户的,在用户态下执行。
系统调用、外部中断、缺页均可以发生在用户态,进程切换不可以发生在用户态。
子程序调用只需保存程序断点,即该指令的下一条指令的地址;中断处理不仅要保存断点(PC的内容),还要保存程序状态字寄存器(PSW)的内容;在中断处理中,最重要的两个寄存器是PC和PSWR。
需要再系统内核态执行的操作是整数除零操作(需要中断处理)和read系统调用函数,sin()函数调用是在用户态下进行的。
trap指令、跳转指令和压栈指令均可以在用户态下执行;关中断指令为特权指令,必须在用户态下才能执行;在操作系统中,关中断指令是权限非常大的指令,因为中断是现代操作系统正常运行的核心保障之一,能把它关掉,说明执行这条指令的一定是权限非常大的机构(管态)。
外部中断处理过程,PC值由中断隐指令自动保存,而通用寄存器内容由操作系统保存。
指令:$DIV R0, R1 ; (R0)/(R1) -> RO 有除零异常的可能
指令:MOV RO, addr ; 把地址addr处的内存数据放入寄存器R0 有缺页异常的可能。
“DMA传送结束” 属于中断。
时钟中断的主要工作数处理和时间有关的信息及决定是否执行调度程序,和时间有关的所有信息包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
操作系统通过提供系统调用避免用户程序直接访问外设;系统调用是操作系统内核为应用程序提供服务的接口;操作系统不同,底层逻辑、实现方式均不相同,为应用程序提供的系统调用接口也不同。
当CPU检测到中断信号后,由硬件自动保存被中断程序的断点(即程序计数器PC),之后,硬件找到该中断信号对应的中断向量,中断向量指明中断服务程序入口地址(各中断向量统一存放在中断向量表中,该表由操作系统初始化),接下来开始执行中断服务程序,保存PSW、保存中断屏蔽字、保存各通用寄存器的值,并提供与中断信号对应的中断服务,中断服务程序属于操作系统内核。
常见的特权指令:
1.有关I/O设备操作的指令
2.有关访问程序状态的指令
3.存取特殊寄存器的指令
trap指令、数据传送指令、设置断点指令均是提供给用户使用的指令,可以在用户态执行。
区分执行态(用户态、核心态)的主要目的是保护系统程序,用户态到核心态的转换发生在中断产生时,而核心态到用户态的转换则发生在中断返回用户程序时。