【内核】
在软件工程思想和结构程序设计方法影响下而诞生的操作系统,几乎都是层次式的结构,操作系统的各项功能被设置在不同的层次上
一些与硬件关联紧密的模块,如时钟管理、中断处理、设备驱动等,会放置在操作系统的最底层,同时,运行频率较高的程序,如进程管理、存储器管理、设备管理等,也同样会放在最底层,这些程序被统称为内核程序
由内核程序组成的数据结构,被称为内核(Kernel),其就是处于最底层、最核心的内核程序的集合
不同的操作系统对内核的定义不同,大多数操作系统内核包括时钟处理、中断机制、原语、系统控制的数据结构及处理这四个方面
1.时钟处理
在计算机的各类部件中,时钟,是最关键的设备,其第一功能是计时,操作系统通过时钟管理,来向用户提供标准的系统时间
此外,通过时钟中断的管理,可以实现进程的切换
2.中断处理
引入中断技术的初衷,是提高多道程序运行环境中 CPU 的利用率,随着操作系统的发展,中断形成了多种类型,称为了操作系统各项操作的基础
在中断机制中,只有一小部分功能属于内核,如负责保护和恢复中断现场的信息,转移控制权到相关的处理程序
这样能够有效的减少中断处理时间,提高系统的并行处理能力
3.原语
按层次设计的操作系统,其底层必然是可被调用的公用小程序,其各自完成一个规定的操作,这些程序被称为原语(Atomic Operation),具有以下特点:
- 处于操作系统的最底层,是最接近硬件的部分
- 这些程序的运行具有原子性,其操作只能一气呵成
- 这些程序的运行时间很段,且调用频繁
系统中的设备驱动、CPU 切换、进程通信等功能中的部分操作都可以被定义为原语,在原语执行过程中,为保证原子性,会关闭中断,让它的所有动作不可分割地完成后再打开中断
4.系统控制的数据结构及处理
系统中用来登记信息的数据结构有很多,如:作业控制块、进程控制块、设备控制块、消息队列、缓冲区、空闲区分配表、内存分配表等等
为实现有效的管理,系统就需要一些基本的操作,常见的操作有:
- 进程管理:进程状态管理、进程调度与分配、创建与撤销进程控制块等
- 存储器管理:存储器空间分配与回收、内存信息保护程序、代码对换程序等
- 设备管理:缓冲区管理、设备分配与回收等
【核心态与用户态】
在计算机系统中,通常 CPU 要执行两种性质不同的程序:
- 应用程序:用户自编的应用程序、系统外层的应用程序
- 内核程序:操作系统内核程序
这两种程序的作用不太,内核程序是应用程序的管理者,而作为管理者,就需要执行一些特殊的命令,这些特殊的命令被称为特权指令,由此,有了特权指令与非特权指令的划分
- 特权指令:计算机中不允许用户直接使用的指令,如 I/O 指令、置中断指令
- 非特权指令:计算机中允许用户直接使用的指令
在操作系统的具体实现上,通过状态寄存器 PSW 来标识两类程序的转换,由此划分出两种状态:
- 用户态:运行应用程序,PSW 置 $0$
- 核心态:运行内核程序,PSW 置 $1$
【中断与异常的概念】
操作系统内核工作在核心态,应用程序工作在用户态,系统不允许应用程序实现核心态的功能,但又必须使用这些功能,因此就要考虑这两种状态如何转换
在实际的操作系统中,当内核态转为用户态时,往往通过特权指令,将 PSW 标志位设为用户态;当用户态转为内核态时,通过 CPU 检测中断信号,由硬件自动变为内核态,即中断屏蔽
简单来说,在某些情况下内核会将 CPU 主动权让给应用程序,中断,是让内核夺回 CPU 使用权的唯一途径,若无中断机制,一旦应用程序运行,其将会一直运行下去
中断(Interruption),也称外中断,是指来自 CPU 执行命令以外的事件的发生,如时钟中断、I/O 请求等,这一类中断通常是与当前程序运行无关的事件,即与当前处理机所运行的程序无关
异常(Exception),也称内中断、陷入(Trap),是指来自 CPU 执行指令内部的事件,如非法操作码、算术溢出、地址越界等,这一类问题的处理一般要依赖于当前程序的运行现场,且异常不能被屏蔽,一旦出现要立即处理
【系统调用】
系统调用,是用户在程序中调用操作系统所提供的一些子功能,其可以被看作特殊的公共子程序
系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作,都必须通过系统调用的凡是提出服务请求,并由操作系统代为完成
通常,一个操作系统所提供的系统调用命令有几十甚至上百条之多,这些系统调用按功能可大致分为以下几类:
- 设备管理:完成设备的请求或释放、设备启动等
- 文件管理:完成文件读、写、创建、删除操作等
- 进程控制:完成经常的创建、撤销、阻塞、唤醒等
- 进程通信:完成进程间的消息传递、信号传递等
- 内存管理:完成内存的分配、回收、作业占用内存区大小等功能
系统调用运行在系统的核心态,其可以保证使用系统功能时系统的稳定性和安全性,防止用户随意更改或访问系统的数据或命令