本文共 2030 字,大约阅读时间需要 6 分钟。
中断:指的是可以使得硬件得以发出通知给处理器,中断可以随时产生(硬件设备再产生中断的时候并不会去考虑和处理器的时钟同步)。
如:敲击键盘时,键盘控制器会发送一个中断,通知操作系统有键按下 中断本质:一种特殊的电信号,由硬件设备发向处理器,处理器收到后会将信号反应到操作系统,然后由操作系统处理新到来的数据(中断信息) 中断流程:硬件设备----->中断控制器------>处理器------>操作系统 硬件设备:负责产生,每个中断都通过一个唯一的数字标志 中断控制器用于收集硬件设备的中断信号(采用的多入口单出口的设计),收到后会发送信号到cpu,一个出口连接cpu, 处理器:当收到信号后会中断当前工作,去处理中断 操作系统:cpu会通知操作系统,然后操作系统会对操作系统进行适当的处理中断和异常不同,异常在产生时必须考虑与处理器时钟同步。异常通常称为同步中断
异常的产生:编程失误错误指令(段错误等)或者执行时缺页等特殊情况,必须靠内核处理,cpu就会产生一个异常 cpu的处理异常和中断的方式类似,因此内核对他们的处理也类似中断处理程序:在响应一个特定中断的时候,内核会执行的函数
产生中断的每个设备都有一个相应的中断处理程序,中断处理程序不是和特定的设备关联而是和特定中断关联,即一个设备可以产生多种不同中断 中断处理程序和其他内核函数的区别:中断处理程序是被内核调用来响应中断的,运行于我们称之为中断上下文(原子上下文,上下文中的执行代码不可阻塞)每一设备都有相关的驱动程序,如果使用中断,相应的驱动程序就注册一个中断处理程序,通过request_irq()函数注册中断处理程序,并激活给定的中断线
request_irq(unsigned int irq, irq_handler_t handler, unsigned ling flags, const char *name, void *dev)
typedef irqreturn_t (*irq_handler_t) (int, void*)
注意:request_irq函数可能会睡眠,因此不能再中断上下文或其他不允许阻塞的代码中调用该函数
内核熵池:负责提供从各种随机事件导出真正的随机数
为什么有上下两部分:因为我们既想中断处理程序运行得快,又想中断处理程序完成的工作量多,二者是矛与盾的关系,因此将中断处理程序切分为两个部分
上半部分:接收到一个中断,立即开始执行,但只做有严格时限的工作 如:对接收的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的 下半部分:能够被允许稍后完成的工作会推迟到下半部去做。 上下不放呢分割的例子: 网卡:网卡接收数据----->通知内核数据包到了,网卡需要立即处理以避免超时 网卡发出中断---->内核----->执行网卡注册的中断处理程序作出响应----->中断开始执行---->通知硬件拷贝数据到内存为什么需要实时拷贝到内存: 防止阻塞,因为网卡的缓存固定相对于内存国小,拷贝到内存时中断的任务就完成了即上半部分的工作完成; 数据包的处理就是下半部分要做的事情。
转载地址:http://dcfkb.baihongyu.com/