目录
1.处理器运行模式
1.1特权指令
1.2非特权指令
2.中断和异常的概念
2.1中断和异常的定义
2.1.1外中断
2.1.2内中断(异常)
2.2中断和异常的处理过程
3.系统调用
计算机系统中,通常 CPU 执行两种不同性质的程序:一种是操作系统内核程序:另一种是用户自编程序(即系统外层的应用程序,或简称“应用程序”)。
对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”(即内核程序)要执行一些特权指令,而“被管理程序”(即用户自编程序)出于安全考虑不能执行这些指令。
特权指令,是指不允许用户直接使用的指令,如IO指令、置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等的指令。
非特权指令,是指允许用户直接使用的指令,它不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间,这也是为了防止用户程序对系统造成破坏。
怎么实现特权指令和非特权指令呢?
在具体实现上,将 CPU 的运行模式划分为用户态(目态)和核心态(又称管态、内核态)。可以理解为 CPU 内部有一个小开关,当小开关为0时,CPU 处于核心态,此时 CPU 可以执行特权指令,切换到用户态的指令也是特权指令。当小开关为 1 时,CPU 处于用户态,此时 CPU 只能执行非特权指令。用户自编程序运行在用户态,操作系统内核程序运行在核心态。
在软件工程思想和结构化程序设计方法影响下诞生的现代操作系统,几乎都是分层式的结构。操作系统的各项功能分别被设置在不同的层次上。一些与硬件关联较紧密的模块,如时钟管理、中断处理、设备驱动等处于最低层。其次是运行频率较高的程序,如进程管理、存储器管理和设备管理等。这两部分内容构成了操作系统的内核。这部分内容的指令操作工作在核心态。
内核是计算机上配置的底层软件,它管理着系统的各种资源,可以看作是连接应用程序和硬件的一座桥梁,大多数操作系统的内核包括 4 方面的内容:
在操作系统中引入核心态和用户态这两种工作状态后,就需要考虑这两种状态之间如何切换。操作系统内核工作在核心态,而用户程序工作在用户态。系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能。因此,需要在核心态建立一些“门”,以便实现从用户态进入核心态。在实际操作系统中,CPU 运行上层程序时唯一能进入这些“门”的途就是通过中或异常。发生中断或异常时,运行用户态的 CPU 会立即进入核心态,这是通过硬件实现的(例如用一个特殊寄存器的一位来表示 CPU 所处的工作状态,0 表示核心态,1 表示用户态。若要进入核心态,则只需将该位置 0即可)。中断是操作系统中非常重要的一个概念,对一个运行在计算机上的实用操作系统而言,缺少了中断机制,将是不可想象的。原因是,操作系统的发展过程大体上就是一个想方设法不断提高资源利用率的过程,而提高资源利用率就需要在程序并未使用某种资源时,把它对那种资源的占有权释放,而这一行为就需要通过中断实现。、
中断(Interruption)也称外中断,是指来自CPU 行指外部的事件,通常用于信息输入/输出,如设备发出的 I/O 结束中断,表示设备输入/输出处理已经完成。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。
异常(Exception)也称内中断,是指来自CPU执行指令内部的事件,如程序的非法操作码、地址越界、运算溢出、虚存系统的缺页及专门的陷入指令等引起的事件。异常不能被屏蔽,一旦出现,就应立即处理。
外中断可分为可屏蔽中断和不可屏蔽中断。可屏敲中断是指通过 INTR 线发出的中断请求,通过改变屏蔽字可以实现多重中断,从而使得中断处理更加灵活。不可屏蔽中断是指通过 NMI线发出的中断请求,通常是紧急的硬件故障,如电源掉电等。此外,异常也是不能被屏蔽的。
异常可分为故障、自陷和终止。故障 (Fault) 通常是由指令执行引起的异常,如非法操作码缺页故障、除数为 0运算溢出等。自陷((Trap)是一种事先安排的“异常”事件,用于在用户态下调用操作系统内核程序,如条件陷阱指令。终止(Abort是指出现了使得 CPU 无法继续行的硬件故障,如控制器出错、存储器校验错等。故障异常和自陷异常属于软件中断(程序性异常),终止异常和外部中断属于硬件中断。
中断和异常处理过程的大致描述如下:当CPU 在执行用户程序的第i条指令时检测到一个异常事件,或在执行第i条指令后发现一个中断请求信号,则CPU 打断当前的用户程序,然后转到相应的中断或异常处理程序去执行。若中断或异常处理程序能够解决相应的问题,则在中断或异常处理程序的最后,CPU 通过执行中断或异常返回指令,回到被打断的用户程序的第 i条指令或第i+1条指令继续执行:若中断或异常处理程序发现是不可恢复的致命错误,则终止用户程序。通常情况下,对中断和异常的具体处理过程由操作系统(和驱动程序) 完成。
所谓系统调用,是指用户在程序中调用操作系统所提供的一些子功能,系统调用可视为特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行 /O 传输及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
通常,一个操作系统提供的系统调用命令有几十条乃至上百条之多。这些系统调用按功能大致可分为如下几类。
系统调用的处理需要由操作系统内核程序负责完成,要运行在核心态。
下面列举一些由用户态转向核心态的例子:
若程序的运行由用户态转到核心态,则会用到访管指令,访管指令是在用户态使用的,所以它不可能是特权指令。
注:文章内容借鉴王道考研,侵权速删