特权级
CPU可以在不同的特权级别下执行指令,通常有两种特权级别,用户模式(用户态)、内核模式(内核态)。
为什么要有特权级的出现?
有了多种特权级模式的存在,操作系统就可以让不同的代码运行在不同的模式上,以达到限制他们权利,提高稳定性和安全性的目的。
程序运行在用户模式和内核模式下有什么区别呢?
普通应用程序运行在用户态的模式下。诸多操作将受到限制,包括访问硬件资源设备、开关中断、改变特权模式等。
一般来说,高特权级是可以降低至低特权级,但是低特权级不能提升自己为高特权级。
中断
系统调用是运行在内核态,普通应用程序运行在用户态,那么普通应用程序怎样调用系统调用呢?
这就牵扯出了一个名词 —中断。
何谓中断呢?
官方一点的语言是: 中断是一个硬件或者软件发出的请求,要求CPU暂停当前的工作转手去处理更加重要的事情。
举两个例子:
1.当我们按下键盘时,键盘会发送一个信号给CPU,CPU 接收到信号后会询问键盘是那个键被按下的。这个信号就是一种中断
2.当我们的网卡接受到数据后,会把数据复制到内存中,然后会发送一个信号给内核,内核从内存中找到数据,然后按照网络协议栈,对数据进行解析和处理,最后把数据发送给应用程序。这个信号就是中断。
中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。
硬件中断和软件中断
硬件中断: 来自于硬件的异常或其他的事情发生,如电源漏电、键盘被按下等。
软件中断:软件中断通常是一条指令(i386下是int),带有一个参数记录中断号,使用这个int指令就可以触发某个中断并执行其中断处理程序。
中断丢失
由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。
假如操作系统处理一次中断的时间特别长,而且此时,又有其他中断信号发来。这就会造成这次的中断没来得及处理,然后就会丢失。
这里又有两个名词–硬中断和软中断。注意和上面的硬件中断和软件中断区分开来。
硬中断和软中断
Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:
硬中断:上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。直接处理硬件请求,特点:快速执行
软中断:下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。 由内核触发。
特点:延迟请求。