Linux的设计哲学之一就是:对不一样的操做赋予不一样的执行等级,就是所谓特权的概念,即与系统相关的一些特别关键的操做必须由最高特权的程序来完成。
Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操做系统中主要采用了0和3两个特权级,分别对应的就是内核态(Kernel Mode)与用户态(User Mode)。架构
Linux中任何一个用户进程被建立时都包含2个栈:内核栈,用户栈,而且是进程私有的,从用户态开始运行。内核态和用户态分别对应内核空间与用户空间,内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。无论是内核空间仍是用户空间,它们都处于虚拟空间中。函数
全部用户程序都是运行在用户态的,可是有时候程序确实须要作一些内核态的事情,例如从硬盘读取数据等。而惟一能够作这些事情的就是操做系统,因此此时程序就须要先操做系统请求以程序的名义来执行这些操做。这时须要一个这样的机制:用户态程序切换到内核态,可是不能控制在内核态中执行的指令。这种机制叫系统调用,在CPU中的实现称之为陷阱指令(Trap Instruction)。spa
当CPU正在执行运行在用户态的程序时,忽然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常。操作系统
当外围设备完成用户的请求操做后,会像CPU发出中断信号,此时,CPU就会暂停执行下一条即将要执行的指令,转而去执行中断信号对应的处理程序,若是先前执行的指令是在用户态下,则天然就发生从用户态到内核态的转换。设计
注意:系统调用的本质其实也是中断,相对于外围设备的硬中断,这种中断称为软中断,这是操做系统为用户特别开放的一种中断,如Linux int 80h中断。因此从触发方式和效果上来看,这三种切换方式是彻底同样的,都至关因而执行了一个中断响应的过程。可是从触发的对象来看,系统调用是进程主动请求切换的,而异常和硬中断则是被动的。指针