1.3.1 处理器运行模式
在计算机系统中,通常CPU执行两种不同性质的程序:
- 一种是操作系统内核程序;
- 另一种是用户自编程序(即系统外层的应用程序,或简称“应用程序”)。
对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”(即内核程序)要执行一些特权指令,而“被管理程序”(即用户自编程序)出于安全考虑不能执行这些指令。
- 特权指令,是指不允许用户直接使用的指令,如I/O指令、置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等的指令。
- 非特权指令,是指允许用户直接使用的指令,它不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间,这也是为了防止用户程序对系统造成破坏。
在具体实现上,将CPU的运行模式划分为用户态(目态)和核心态(又称管态、内核态)。
![[CPU的状态.png]]
操作系统的各项功能分别被设置在不同的层次上。
- 一些与硬件关联较紧密的模块,如时钟管理、中断处理、设备驱动等处于最低层。
- 其次是运行频率较高的程序,如进程管理、存储器管理和设备管理等。
**这两部分内容构成了操作系统的内核。这部分内容的指令操作工作在核心态。
内核是计算机上配置的底层软件,它管理着系统的各种资源,可以看作是连接应用程序和硬件的一座桥梁。
大多数操作系统的内核包括4方面的内容:
1. 时钟管理
操作系统需要通过时钟管理,向用户提供标准的系统时间。
2. 中断机制
引入中断技术的初衷是提高多道程序运行环境中CPU的利用率,而且主要是针对外部设备的。
中断机制中,只有一小部分功能属于内核,它们负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力。
3. 原语
原语的特点如下:
- 处于操作系统的最底层,是最接近硬件的部分。
- 这些程序的运行具有原子性,其操作只能一气呵成(出于系统安全性和便于管理考虑)。
- 这些程序的运行时间都较短,而且调用频繁。
*通常把具有这些特点的程序称为原语(Atomic Operation)。定义原语的直接方法是关闭中断,让其所有动作不可分割地完成后再打开中断。
系统中的设备驱动、CPU切换、进程通信等功能中的部分操作都可定义为原语,使它们成为内核的组成部分。
- 系统控制的数据结构及处理
系统需要一些基本的操作,常见的操作有以下3种: - 进程管理。进程状态管理、进程调度和分派、创建与撤销进程控制块等。
- 存储器管理。存储器的空间分配和回收、内存信息保护程序、代码对换程序等。
- 设备管理。缓冲区管理、设备分配和回收等。
从上述内容可以了解,核心态指令实际上包括系统调用类指令和一些针对时钟、中断和原语的操作指令。
1.3.2 中断和异常的概念
发生中断或异常时,运行用户态的CPU会立即进入核心态,这是通过硬件实现的(例如,用一个特殊寄存器的一位来表示CPU所处的工作状态,0表示核心态,1表示用户态。若要进入核心态,则只需将该位置0即可)。
1.中断和异常的定义
中断(Interruption) 也称外中断,是指来自CPU执行指令外部的事件。
通常用于信息输入/输出,如设备发出的I/O结束中断,表示设备输入/输出处理已经完成。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。
异常(Exception)也称内中断,是指来自CPU执行指令内部的事件。
如程序的非法操作码、地址越界、运算溢出、虛存系统的缺页及专门的陷入指令等引起的事件。异常不能被屏蔽,一旦出现,就应立即处理。
关于内中断和外中断的联系与区别如图所示:
![[内中断和外中断的联系.png]]
2.中断和异常的分类
外中断可分为可屏蔽中断和不可屏蔽中断。
- 可屏蔽中断是指通过INTR线发出的中断请求,通过改变屏蔽字可以实现多重中断,从而使得中断处理更加灵活。
- 不可屏蔽中断是指通过NMI线发出的中断请求,通常是紧急的硬件故障,如电源掉电等。此外,异常也是不能被屏蔽的。
异常可分为故障、自陷和终止。
- 故障(Fault) 通常是由指令执行引起的异常,如非法操作码、缺页故障、除数为0、运算溢出等。
- 自陷(Trap) 是一种事先安排的“异常”事件,用于在用户态下调用操作系统内核程序,如条件陷阱指令。
- 终止(Abort) 是指出现了使得CPU无法继续执行的硬件故障,如控制器出错、存储器校验错等。故障异常和自陷异常属于软件中断(程序性异常),终止异常和外部中断属于硬件中断。
3.中断和异常的处理过程
![[中断处理过程.png]]
1.3.3 系统调用
#概念
系统调用是指用户在程序中调用操作系统提供的一些子功能,系统调用可视为特殊的公共子程序。
系统调用按功能大致可以分为如下几类:
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- 文件管理。完成文件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能。
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及始址等功能。
系统调用的处理需要由操作系统内核程序负责完成,要运行在核心态。
用户程序可以执行陷入指令(又称访管指令或trap指令)来发起系统调用,请求操作系统提供服务。
![[系统调用执行过程.png]]