关于linux的中断系统网上有好多文章,基本的原理流程都能查的差不多。
这里是我个人学习或使用中遇到的一些疑问,作为一个记录。
个人理解,可能会有错漏,欢迎指出。
1,linux内核有没有中断优先级?
linux中断没有引入优先级的概念,并且现在linux内核会在执行中断处理函数时禁止cpu中断。
2,关于IRQF_DISABLED
这个flag已经在新版本内核中不再使用,加与不加都没有区别。 之前版本内核(2.6.35之前)加上该标志表示该中断为快速中断,中断处理全程禁止cpu中断,如果不加则为慢速中断,执行中断处理函数时不会禁止cpu中断。
现在,所有中断都会禁止cpu中断。
3,中断线程化
linux引入了中断线程化,是为了提高系统实时性,
- int request_threaded_irq(unsigned int irq, irq_handler_t handler
- irq_handler_t thread_fn, unsigned long irqflags,
- const char *devname, void *dev_id)
申请一个线程化的IRQ,kernel会为中断的底版本创建一个名字为irq/%d-%s的线程,%d对应着中断号。其中顶半部(硬中断)handler在做完必要的处理工作之后,会返回IRQ_WAKE_THREAD,之后kernel会唤醒irq/%d-%s线程,而该kernel线程会调用thread_fn函数,因此,该线程成为底半部。
还有网络上这张图:
4,cpu收到中断之后如何获取中断号?
cpu从中断控制器获取中断号的代码在各个平台的entry-macro.S文件,宏:get_irqnr_preamble
中断号会存在 r0
之后跳转到asm_do_IRQ第一个参数就是中断号。