用户态切换到内核态的3种方式

https://baike.baidu.com/item/核心态/6845908

在处理器的存储保护中,主要有两种权限状态,一种是核心态(管态),也被称为特权态;一种是用户态(目态)。核心态是操作系统内核所运行的模式,运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。
 
中文名
核心态
又    称
特权态
类    型
操作系统内核所运行的模式
相    关
无限制地对系统存储
功    能
外部设备进行访问
微核操作系统基于安全与优雅的考虑,试图将运行在特权态的代码数量最小化。
x86结构很特别地具有四种特权等级,特权级别最高的是ring 0,被视作核心态;级别最低的是ring 3,常被看作用户态;rings 1 and 2则很少被使用。
386及以上的CPU实现了4个特权级模式(WINDOWS只用到了其中两个),其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,象DOS这种实模式操作系统则没有这些概念,其中的所有代码都可被看作运行在核心态。既然运行在核心态有如此之多的优势,那么病毒当然没有理由不想得到Ring0。处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。具体的转移细节由于涉及复杂的保护检查和堆栈切换,不再赘述,请参阅相关资料。现代的操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令来完成模式切换,在INTEL X86上这条指令是INT,如在WIN9X下是INT30(保护模式回调),在LINUX下是INT80,在WINNT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求并将结果传给用户程序
UNIX系统把执行状态(UNIX内核为进程设置了9种状态:执行,就绪,睡眠,“创建”与“僵死”,“被抢占”等)分为两种:一种是用户态执行,表示进程正处于用户状态之中执行;另一种是核心态执行,表示一个应用进程执行系统调用后,或I/O中断、时钟中断后,进程便处于核心态执行。
这两种状态的主要差别是: 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的 ; 而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的。

用户态切换到内核态的3种方式

(1) 系统调用这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
(2) 异常当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
(3) 外围设备的中断当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
具体的切换步骤:
① 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
②使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
③ 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。 [1] 

简介

计算机指令是规定计算机操作类型及操作数地址的一组二进制代码。是控制计算机动作的 “命令”。一条机器指令通常分操作码与操作数两部分,是一串若干位的二进制代码。操作码使计算机产生不同的动作,操作数指明被操作的对象,可以是操作数本身,也可是被操作数在内存中的地址。陷阱指令是处理计算机系统意外中断的指令 [1]  ,是由于系统调用引起处理机中断的指令。陷阱指令可以使执行流程从用户态陷入内核并把控制权转移给操作系统,使得用户程序可以调用内核函数和使用硬件从而获得操作系统所提供的服务,比如用视频软件放一个电影,视频软件就发出陷阱使用显示器和声卡从而访问硬件。

陷阱

陷阱是由于某条指令执行或结果出现异常引起的程序控制权自动转移,譬如非法指令、非法访问等异常就会引起陷阱。陷阱表中存放有两类陷阱,一种是硬件陷阱,另一种是由软件陷阱指令产生的软件陷阱。陷阱类似异常的进程调用,需中断现行程序的进程、保留现场并转到处理程序中去。的陷阱可分为大类精确型陷阱、延迟型陷阱和中断。精确型陷阱是由于特殊的指令而产生的,它发生在状态被产生陷阱的指令改变之前。延迟型陷阱也是由于特殊的指令而产生的,它发生在引起陷阱的指令将程序状态改变之后。状态的改变可以是由于执行了陷阱产生指令或是其随后的某条指令。延迟型陷阱在执行完陷阱产生指令之后会执行一条或多条指令,但是延迟型陷阱必须发生在任何一条依赖于陷阱产生指令的指令被执行之前。也就是说,延迟型陷阱不能被延迟到一条与陷阱产生指令可能会改变的寄存器、条件码或是其他软件可见状态相关的指令执行之后。同时除非是浮点异常或协处理器异常,否则延迟型陷阱也不能被延迟到精确性指令之后。中断既不是精确型陷阱也不是延迟型陷阱。它由处理器核外部的异步事件产生的中断请求引起 [2]  。

原因


程序错误是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。系统程序错误是指系统程序本身有错误而造成的功能不正常、死机或中断等现象。有些系统程序错误会造成计算机安全隐患,此时叫做系统漏洞。
硬错误是由于硬件的损坏或缺陷造成的,因此数据总是不正确的,此类错误是无法纠正的;软错误是随机出现的,例如在内存附近突然出现电子干扰等因素,可能造成内存软错误的出现。操作系统或程序访问内存地址不在当前物理内存中,而在磁盘上的页面文件内的情况。
调用特权指令,所谓特权指令,就是在系统态时运行的指令,是关系到系统全局的指令。其对内存空间的访问范围基本不受限制,不仅能访问用户存储空间,也能访问系统存储空间,如启动各种外部设备、设置系统时钟时间、关中断、清主存、修改存储器管理寄存器、执行停机指令、转换执行状态等。特权指令只允许操作系统使用,不允许应用程序使用,否则会引起系统混乱[3]  。

系统调用


系统调用(system call),又称为系统调用,指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态运行。如设备IO操作或者进程间通信。操作系统的进程空间可分为用户空间和内核空间,它们需要不同的执行权限。其中系统调用运行在内核空间。系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核核心态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。
 
 

https://baike.baidu.com/item/陷阱指令

陷阱指令是处理陷阱的指令。陷阱是指计算机系统在运行中的一种意外事故,例如电源电压不稳、存储器检验出错、存储器校验出错、输入输出设备出现故障、用户使用了未定义的指令或特权指令等意外情况,使得计算机系统不能正常工作。一旦出现陷阱,计算机应能暂停当前程序的执行,及时转入故障处理程序进行相应的处理。在一般的计算机中,陷阱指令作为隐含指令不提供给用户使用,只有在出现故障时,才由CPU自动产生并执行。也有一些计算机设置了可供用户使用的陷阱指令 [1]  。

https://baike.baidu.com/item/非法指令陷阱

单片机(MCU)正常工作时,每次获得的都是由汇编编译程序生成的有效操作码,MCU能正确解释并执行它们,但是,当MCU受到干扰或系统出现混乱时,可能得到无法识别的无效操作码,即非法指令,此时MCU就进入非法指令陷阱,MCU就停在非法指令处。
 
中文名
非法指令陷阱
外文名
Illegal instruction trap
学    科
计算机
发生时间
指令执行时

在计算机中,中断是指CPU对系统发生某事件时的这样一种响应: CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行。内中断则是指由于CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)、电源故障等。 [1]  内中断(trap)也被译为“捕获”或“陷入,非法指令属于内部中断,非法指令陷阱通常是因为可执行文件本身出现错误, 或者试图执行数据段和无效操作码,堆栈溢出时也有可能产生这个信号。

根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。
 
根据中断源产生的条件,可把中断分为外中断和内中断。外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。
内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。
为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。例如在UNIX系统中,外中断和陷阱的优先级共分为8级。为了禁止中断或屏蔽中断,CPU的处理器状态字PSW中也设有相应的优先级。如果中断源的优先级高于PSW的优先级,则CPU响应该中断源的请求;反之,CPU屏蔽该中断源的中断请求。
各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。除了在优先级的设置方面有区别之外,中断陷阱还有如下主要区别:
陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷阱处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。中断是由硬件引起的,而异常是由软件引起的;中断是异步的,而异常是同步的。
 
原文地址:https://www.cnblogs.com/rsapaper/p/7897275.html