1.CPU指令
CPU的指令类型有特权指令与非特权指令。应用程序只能使用“非特权指令”,如:加法指令,减法指令等。操作系统内核作为“管理者”,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大只允许“管理者”一即操作系统内核来使用。
在CPU设计和生产的时候就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判断出其类型,CPU是怎么判断出指令类型的呢?
CPU有两种状态,“内核态”和“用户态”CPU 中有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0示“用户态”
处于内核态(核心态,管态)时,说明此时正在运行的是内核程序,此时可以执行特权指令
处于用户态(目态)时,i说明此时正在运行的是应用程序,此时只能执行非特权指令
2.内核态、初始态的切换
内核态--->用户态: 执行一条特权指令--修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权
用户态--->内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权,这种情况会发生在非法使用特权指令,或者操作系统需要开展某项管理工作,即操作系统需要介入,都需要触发中断信号。
举个例子:
(1)开机时,需要加载操作系统,进行操作系统的初始化工作,初始化工作就是由操作系统中某些内核程序完成的,所以CPU此时处在"内核态"
(2)开机完成后,用户可以启动某个应用程序。
(3)操作系统内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行。操作系统内核在让出CPU之前,会用一条特权指令把 PSW 的标志位设置为“用户态”
(4)应用程序运行在“用户态”
(5)若此时植入一条特权指令,这个非法事件会引发一个中断信号,但CPU检查PSW的状态为“0”,处于“用户态”,CPU检测到中断信号后,会立即变为“核心态”,并停止运行当前的应用程序(拒绝执行这一植入的特权指令),转而运行处理中断信号的内核程序
(6)操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序
3.中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。中断处理程序一定是内核程序,需要运行在“内核态”。
4.中断的类型
中断的类型由内中断与外中断。内中断(异常,例外)与当前执行的指令有关,中断信号来源于CPU内部。
内中断:
内中断,也称为异常,有以下几种类型:
陷阱、陷入:由陷入指令引发,是应用程序故意引发的
故障:由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把 CPU使用权还给应用程序,让它继续执行下去。如: 缺页故障。
终止:由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0、非法使用特权指令。
内中断的例子:
1.由非法植入的特权指令引起的中断(终止)
2.除法指令中发现除数为0,也会引起内中断(终止)。
3.有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令--陷入指令,该指令会引发一个内部中断信号。("系统调用"就是通过陷入指令完成的)
注:陷入指令是一条特殊的指令,不是特权指令
所以若当前执行的指令是非法的,则会引发一个中断信号。
注:CPU在执行指令时会检查是否有异常发生
这里补充一下系统调用:
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务
系统调用的作用:
操作系统内核会对共享资源进行统一的管理,并向上提供“系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。
应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
高级语言的库函数,在底层也会使用到系统调用,所以系统调用是比高级语言的库函数更为底层的接口:
注:不是所有的库函数都需要涉及系统调用
不涉及系统调用的库函:如的“取绝对值”的函数
涉及系统调用的库函数:如“创建一个新文件”的函数
系统调用的过程:
1.应用系统首先会执行传参指令,传参指令会将参数传递到寄存器中,传递多少参数取决于系统调用需要多少参数,操作系统会根据这些参数判断是哪种类型的服务。
2.参数传递完毕后,应用程序会执行陷入指令,触发内中断信号,转入相应的中断处理程序一即系统调用的入口程序
3.接下来CPU就会响应中断,进行系统调用入口程序的处理,此时CPU的状态由"用户态"转为"内核态",该程序会根据寄存器中的参数判断用户需要哪种系统调用服务。
4.接下来CPU就会转入响应的系统调用处理程序进行处理。
总结来讲就是:
传递系统调用参数--->执行陷入指令(用户态)--->执行相应的内核请求程序处理系统调用(核心态)
--->返口应用程序
注意:
1.陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
2.发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
外中断:
外中断(中断)与当前执行的指令无关,中断信号来源于CPU外部。
1.时钟中断---由时钟部件发来的中断信号。时钟部件每隔一个时间片(如 50ms) 会给CPU发送一个时钟中断信号,通过这个时钟中断信号就可以实现多道程序并发运行了。
假设系统中想要并发执行两个应用程序,应用程序1执行自己的应用程序,直到50ms,时钟部件会向CPU发送中断信号,CPU收到中断信号会将“用户态”转变为“内核态”,在内核态下执行内核程序,处理中断信号,并且决定让另一个应用程序上CPU运行。所以切换应用程序2上CPU运行。这样两个应用程序就可以实现交替运行。
2.I/O中断一一由输入/输出设备发来的中断信号。
当输入输出任务完成时,向CPU发送中断信号。CPU收到中断信号,就会处理I/O中断中的内核程序。
注:CPU在每一条指令执行结束后,都会理性检查是否有外中断信号。