__this_cpu_write(tasklet_hi_vec.tail, &(t->next)); raise_softirq_irqoff(HI_SOFTIRQ); local_irq_restore(flags); } 2.3 tasklet执行过程 软中断执行时会按照软中断状态__softirq_pending来依次执行pending状态的软中断,当执行到TASKLET_SOFTIRQ软中断时,调用tasklet_action(),HI_SOFTIRQ为tasklet_hi_action。
open_softirq(TASKLET_SOFTIRQ, tasklet_action); open_softirq(HI_SOFTIRQ, tasklet_hi_action); } 软中断注册函数 voidopen_softirq(intnr,void(*action)(structsoftirq_action *)) { softirq_vec[nr].action=action; } 触发软中断 写标志位,唤醒软中断线程,根据标志位执行软中断服务函数 voidraise_softirq(un...
tasklet_hi_action 是高优先级的 tasklet,tasklet_action 是普通的 tasklet,两者实现原理都一样。 C++ // kernel\linux-4.9\init\main.casmlinkage __visiblevoid__initstart_kernel(void){...softirq_init();...}// kernel\linux-4.9\kernel\softirq.cvoid__initsoftirq_init(void){intcpu;// 初始化链表fo...
open_softirq(TASKLET_SOFTIRQ, tasklet_action);:注册TASKLET_SOFTIRQ软中断,并指定对应的处理函数为tasklet_action。这样,在TASKLET_SOFTIRQ被触发时,将会调用tasklet_action函数来处理相应的任务。 open_softirq(HI_SOFTIRQ, tasklet_hi_action);:注册HI_SOFTIRQ软中断,并指定对应的处理函数为tasklet_hi_action。这样,...
描写叙述每一种类型的软中断,其中void(*action)是软中断触发时的运行函数。 软中断全局数据和类型 static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; enum { HI_SOFTIRQ=0, /*用于高优先级的tasklet*/ TIMER_SOFTIRQ, /*用于定时器的下半部*/ ...
调用raise_softirq_irqoff()激活TASKLET_SOFTIRQ或HI_SOFTIRQ软中断。 调用local_irq_restore恢复中断标志IF。 接下来,我们看看tasklet是如何执行的。其实,跟其它软中断的执行过程类似。软中断被激活,do_softirq()就会执行对应的软中断函数。HI_SOFTIRQ软中断对应的函数为tasklet_hi_action(),而TASKLET_SOFTIRQ对应的函数...
调用raise_softirq_irqoff()激活TASKLET_SOFTIRQ或HI_SOFTIRQ软中断。 调用local_irq_restore恢复中断标志IF。 接下来,我们看看tasklet是如何执行的。其实,跟其它软中断的执行过程类似。软中断被激活,do_softirq()就会执行对应的软中断函数。HI_SOFTIRQ软中断对应的函数为tasklet_hi_action(),而TASKLET_SOFTIRQ对应的函数...
在软中断的初始化函数softirq_init的最后,内核注册了TASKLET_SOFTIRQ和HI_SOFTIRQ这两个软中断: void__init softirq_init(void) { ... open_softirq(TASKLET_SOFTIRQ, tasklet_action); open_softirq(HI_SOFTIRQ, tasklet_hi_action); } void __init softirq_init(void) { ....
HI_SOFTIRQ软中断相关的软中断函数是tasklet_hi_action(),而与TASKLET_SOFTIRQ相关的函数是tasklet_action() 1.禁止本地中断 2.获得本地CPU的逻辑号n 3.把tasklet_vec[n]或tasklet_hi_vec[n]所指向的链表的地址存入局部变量list 4.把tasklet_vec[n]或tasklet_hi_vec[n]的值赋为NULL,因此已调度的tasklet描写...
执行,tasklet_action()和tasklet_hi_action(),具体的执行软中断。 杀死,tasklet_kill(),。。。 tasklet_int()函数实现如下(kernel/softirq.c): voidtasklet_init(structtasklet_structt, void(func)(unsignedlong),unsignedlongdata) { t->next=NULL; t->state=0; ...