第一章, 中断与时钟
申请irq,request_irq(irq, handler, flags, name, dev)。Flags一般有触发方式,SHARED等。用devm_request_irq()不需要free。
使能,enable_irq(irq)。使能某个中断。
开关本CPU上的所有中断, local_irq_save(flags),local_irq_restore(flags)。
下半部,tasklet。创建,DECLARE_TASKLET()。触发,tasklet_schedule()。运行在软中断的上下文中,不可睡眠。
下半部,工作队列,WORK。创建,INIT_WORK()。触发,schedule_work()。 运行在内核线程上下文,可以睡眠。
软中断,softirq。注册,open_softirq()。触发,raise_softirq()。用得很少,只有HI_SOFTIRQ,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ, SCSI_SOFTIRQ,TASKLET_SOFTIRQ。
优先级是中断高于软中断,软中断高于线程。
下半部可以关闭,local_bh_enable()/disable()。
申请中断还可以通过request_threaded_irq(),则thread_fn运行于线程上下文。中断处理程序中返回IRQ_WAKE_THREAD,则触发该线程。
中断共享。申请时设置IRA_SHARED。在handler中检查,如果非自己的中断,则返回IRQ_NONE,否则返回IRQ_HANDLED。
定时器,struct