【中断】自己写一个中断处理程序,需要注意哪些问题?
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
Linux中断知识汇总:
目录
什么是中断处理程序?
中断处理程序:在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序。产生中断的每一个设备都有一个相应的中断处理程序。中断处理程序是被内核调用来响应中断的,他们运行于中断上下文中,该上下文中的代码不可阻塞。
我们一般把中断处理分为两个部分。中断处理程序是上半部——接收到一个中断就立即开始执行,通常用于做有严格时限的工作。能够被允许稍后运行的工作会被推迟到下半部去。此后在合适的时机,下半部会被运行。
注册中断处理程序
int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)
具体说明:
irq是要申请的硬件中断号。
handler是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。
irqflags是中断处理的属性:
若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版zhon已经不支持了),则表示中断处理程序是 快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;
若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断;
若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。(这几个flag是可以通过或的方式同时使用的)
devname设置中断名称,通常是设备驱动程序的名称 在cat /proc/interrupts中可以看到此名称。
dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。
编写中断处理程序
static inqreturn_t intr_handler(int irq, void *dev)
具体说明:
第一个参数irq就是这个处理程序要响应的中断号。如今这个参数已经没什么用了,可能只是在打印日志信息时会用到。
第二个参数dev是一个通用指针,它在与中断处理程序注册时传递给request_irq的产生dev必须一致。dev可能指向中断处理程序使用的一个数据结构。
中断处理程序可能返回两个特殊的值:IRQ_NONE和IRQ_HANDLED。当不是在注册处理函数期间产生源,返回IRQ_NONE。当中断处理程序被正确调用,且确实是它所对应的设备产生了中断时,返回IRQ_HALDLED。
linux下的中断处理函数无需考虑重入,默认中断嵌套功能是不开启的。
编写中断处理程序的注意事项
- 【不可以执行耗时的任务】代码执行效率尽量高,代码一定要简洁,尽量少调用其他函数,尽量避免增加中断的执行时长,中断处理需要快进快出。
- 不可以使用耗时很长的函数,因为中断会关闭调度,中断的优先级高于任何任务的优先级,长时间的中断处理会影响到系统的响应速度,使整个系统的任务无法政策运行,造成很多的任务超时,容易导致很多不可预知的后果。【可以使用中断底半部解决】
- 对于一些必须的操作可以放在中断中处理,其他的以异步执行的方式,放到中断底半部中解决。
- 【不可以睡眠或者放弃CPU】中断处理程序中不可以睡眠,不可以使用可能引起睡眠的函数,也不可以使用可能会引起睡眠的锁。
- 不可以使用metux等引起休眠的锁。可以使用自旋锁,但必须保证自旋等待时间足够短。【可以使用自旋锁解决】
- 不可以使用会引起休眠的函数。比如ssleep(), msleep(), kmalloc, copy_to_user(), copy_from_user() 等。
- 【中断是不可重入函数】同一时刻同一中断只能在一个CPU上被触发,中断被响应后会被关闭该中断,相同的中断处理函数不能同时在多个处理器上运行。
为什么在中断里不可以睡眠?
从系统调度的角度来说,调度的触发方式有几种(主动触发、睡眠、唤醒、中断退出时的判断),而在进入中断之前,系统调度会被关闭。在调度函数schedule()中,也会首先判断是否在中断上下文,如果是则直接退出。此时一旦睡眠或者放弃CPU,这时内核无法调度别的进程来执行,系统就会死掉。
为什么在中断里不可以使用耗时很长的函数?
因为中断会关闭调度,中断的优先级高于任何任务的优先级,长时间的中断处理会影响到系统的响应速度,使整个系统的任务无法政策运行,造成很多的任务超时,容易导致很多不可预知的后果。【可以使用中断底半部解决】
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献1条内容
所有评论(0)