LKD6

第六章 中断和中断处理程序

1.处理器的速度和外围硬件的速度不在一个数量级上,所以专门等待硬件的响应时不合理的。
2.轮询是一种解决的机制,但是内核还是需要做些无用功。更好的机制是中断机制。
3.中断使得硬件和处理器进行通信,本质上是一个特殊的电信号,硬件向处理器发送,处理器收到中断后,告诉操作系统中断的到来,然后由OS处理这些新来的数据。
4.不同的设备对应不同的中断。每个中断通过唯一的数字标识,操作系统给不同的中断提供不同的中断处理程序。
5.IRQ线:关键是特定的中断总是与特定的设备相关联,而且内核知道这些信息。
6.异常再产生是必须考虑与处理器同步。异常也称为同步中断。常见的异常:缺页处理,软中断自陷,0除等。
----------------------------------------------------------------------------------
1.ISR:不是与特定设备相关联的,而是对应设备的中断。ISR是驱动程序的一部分。
2.ISR是特定类型声明的C函数。运行于中断上下文中。
3.因为中断产生的随意性,中断处理程序应该尽可能的短下且迅速返回,但是即使是最精简的ISR,也要同硬件设备进行交互。
4.矛盾的解决方案是分成两个部分,上半部称之为ISR,接收到中断,立即执行,制作严格时限的动作,比如对中断进行应答等。能够稍微允许的工作推迟到下半部。
-----------------------------------------------------------------------------------
1.注册,request_irq()函数。handler的原型是接收三个参数。并且返回类型为irqreturn_t.
2.SA_interrupt:是指快速中断,在本地处理器上,快速中断禁止所有中断的情况下运行。默认情况没有次标识。
3.SA_SHIRQ与dev_id的参数,都是用来共享中断线的。实践中更多的使用设备结构。
4.request_irq可能会引起睡眠。在注册过程中,内核需要在/proc/irq虾米那创建一个与中断对应的项。proc_mkdir->proc_create->kmalloc,因为kmalloc可能会引起睡眠。
5.释放:free_irq(),如果中断不是共享的,该函数删除isr并且禁用中断。
-----------------------------------------------------------------------------------
1.pt_regs的结构参数,包含处理中断之前处理器的寄存器和状态,基本上不能使用。
2.中断处理程序通常被标记成static.
3.Linux系统中,中断处理程序时无需重入的。当一个isr正在执行时,相应的中断时被屏蔽的。所以也防止了嵌套。
4.中断上下文与进程没有什么相关,也与current没什么瓜葛。中断上下文不可以睡眠。也不能进行重新调度,任何会引起睡眠的地函数都不能调用。
5.早期,中断处理程序并不具有自己的栈,而是使用索中断进程的内核栈。2.6 以后,每个进程的内核栈减小为一半,而中断也不再占用内核栈。而有一页专用的中断栈。
------------------------------------------------------------------------------------
1.中断处理系统非常依赖于体系结构,实现也依赖于处理器,中断控制器,和体系结构的设计及机器自身。
2.硬件->中断控制器-〉处理器-〉内核入口-〉do_IRQ()->是否有isr?->handle_IRQ_event->运行中断处理程序-〉从内核返回。
3./proc/interrupts:与体系结构相关。
4.控制中断系统的原因归根到底是需要提供提供。通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。禁止中断也就禁止了内核抢占,但是都没有解决多处理器的并发访问。
5.local_irq_disable()和local_irq_enable():存在潜在的风险。
local_irq_save(flags)和local_irq_restore():保存状态。必须在同一个函数中执行。flags不能传递给另一个函数。
6.禁止指定中断:屏蔽掉。disable_irq()/disable_irq_nosync,enable_irq,synchronize_irq()
函数只有在当前正在执行的所有处理程序完成后,disable_irq才返回?什么意思?
disable_irq_nosync不会等待当前中断处理程序执行完毕,synchronize_irq等待一个 特定的中断处理程序的推出,如果该处理程序正在执行,该函数必须退出后才能返回?我觉得这里似乎都没有说清楚。
7.可以嵌套调用,但是也必须成对出现。后面三个可以从中断和进程上下文调用,不会睡眠。
-------------------------------------------------------------------------------------1.当前中断系统的状态:禁止?激活?是否处于中断上下文?
irqs_disable()
in_interrupt()和in_irq():是否包含下半部的问题。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章