特权指令
从指令系统(指令集)角度定义,在指令系统中拥有用于管理硬件和整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令将发生异常,并切换到管态由操作系统接管cpu,所以用户程序不得使用特权指令,需要执行特权指令需要使用防管指令,进入核心态。
访管指令
同样从指令集的角度定义,或者说从硬件角度(cpu状态)。防管指令,是用户程序自愿进管的指令(进管同时也意味着程序放弃cpu的控制权),该指令本身属于非特权指令,可在用户态执行,执行后进入核心态。核心态是通过cpu置相应标志表明当前处于核心态。cpu进入核心态后可以执行指令集中的所有指令(包括特权指令和非特权指令,但不执行访管指令)。
陷入指令
原则上可看作访管指令,但是从操作系统的角度定义的。访管强调的是cpu从用户态切换到了核心态,可以执行指令集中的所有指令。而陷入(自陷、陷阱)指令强调程序从用户程序切换到了操作系统,陷入指令即汇编中的中断指令,执行陷入指令程序中断,跳转到中断服务程序(操作系统的代码)。所有访管强调的是可以执行特权指令,陷入强调的是进程放弃cpu,交还给操作系统。其实核心态和操作系统是不可分割的:道理很显然,进入核心态(管态),必然需要“跳转”到操作系统,不然区分用户态和核心态就没有了意义,如果程序执行完访管指令后,只是进入了管态,之后仍然执行自身的代码,那用户程序将可以为所欲为,显然不能允许。另一方面,如果cpu跳转到了操作系统,没有进入管态,那操作系统也无法执行特权指令,管理整个机器,显然也不行(当然也存在操作系统一部分运行在用户态,一部分(即内核)运行在管态,此时操作系统获取cpu控制权后不一定是处于核心态)。所有管态就是运行操作系统,访管指令本质上就是一条陷入(中断)指令。
系统调用
系统调用,从操作系统的角度定义的。指用户程序需要借助操作系统来完成的特定操作,通过陷入指令可以进行系统调用。系统调用是一段代码而不是一条代码,在高级语言层面可能是一条,比如c语言的系统调用write(),在汇编层面这条语句包括,初始化相关参数和寄存器,执行陷入(中断)指令,跳转到中断服务程序,中断返回。之所以需要系统调用是因为用户程序不能执行特权指令,所以当需要完成特权指令才能做的特定操作,必须通过系统调用由操作系统完成。但系统调用一词并非强调程序不能使用特权指令,即不强调“需要”操作系统服务,仅仅强调“希望”让操作系统服务,表达的含义不是"不能"而是"不需要",即目标操作用户程序不需要自己做,直接调用操作系统即可完成,进行系统调用时也并非一定为了执行特权指令,也可能相关操作过于复杂,或者用户程序自身难以实现(有权做但做起来麻烦),而操作系统刚好给出了相应的接口供直接使用。
评论区