Linux 中断为什么必须“上半部快进快出”:
Linux 中断处理的核心就一条:上半部必须快进快出。
硬中断一进来,CPU 就得停下手里的活。它干得越久,系统就越卡。所以硬件状态得立刻确认,剩下的活赶紧丢给下半部。
硬中断只干最急的:查查是不是自己设备的事,清掉中断防轰炸,把数据搬出来。这地方绝对不能睡觉,拿锁也得小心,千万别碰可能阻塞的操作。
需要睡觉的活交给线程:比如去 I2C 上读数据、用互斥锁同步。这种活适合用线程化中断,能睡也能慢慢干。要是纯为了高吞吐,还得靠软中断批量处理。
实在耗时的活丢给工作队列:比如设备恢复、重新初始化。这些活不着急,交给工作队列慢慢做就行。
干活前先想好怎么加锁:硬中断和进程共享数据时,加锁得防死锁。而且别光用一个布尔变量当标志,多个中断挤一块容易丢消息。
最后提醒一句:卸载驱动或休眠前,一定要等所有底半部彻底停稳。不然内存都释放了,底半部还在跑,系统直接崩给你看。
原文Linux 中断为什么必须“上半部快进快出”:从 hard IRQ、threaded IRQ 到 softirq 与 workqueue