Lorsqu'une interruption est générée, le gestionnaire d'interruption sera saisi.
Mais le gestionnaire d'interruption doit être rapide, asynchrone et simple pour répondre rapidement au matériel et terminer ces opérations urgentes.
Par conséquent, pour les autres tâches qui ont des exigences de temps relativement lâches, elles devraient être reportées jusqu'à ce que l'interruption soit activée avant l'exécution.
De cette façon, l'ensemble du processus de traitement des interruptions est divisé en deux parties :
La tâche de la moitié inférieure est principalement d'effectuer des travaux liés aux interruptions, qui ne sont pas complétés par la routine de service d'interruption lui-même .
La seconde moitié n'a pas besoin de préciser une heure exacte, il suffit de reporter un peu ces tâches et de les laisser être exécutées lorsque le système n'est pas trop occupé et après le rétablissement de l'interruption.
La principale différence entre les moitiés supérieure et inférieure :
La moitié supérieure fait référence au gestionnaire d'interruption, et la moitié inférieure fait référence à certaines choses liées aux interruptions. Mais peut reporter l'exécution des tâches de .
La moitié supérieure de l'interruption ne peut pas être interrompue par le même type d'interruption, tandis que la moitié inférieure peut toujours être interrompue par des interruptions.
Habituellement, la moitié inférieure s'exécutera dès le retour du gestionnaire d'interruption.
La première moitié est simple et rapide, et tout ou partie des interruptions sont interdites pendant l'exécution.
La seconde moitié sera exécutée plus tard, et toutes les interruptions peuvent recevoir une réponse pendant l'exécution.
Linux
中,对中断下半部的实现主要有三种:Linux
中,对中断下半部的实现主要有三种:
softirq
即软中断,代码位于kernel/softirq.c
文件中;
每个软中断由softirq_action
结构表示:
在softirq.c
中定义了一个软中断向量数组softirq_vec
:
static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; enum { HI_SOFTIRQ=0, /*用于高优先级的tasklet*/ TIMER_SOFTIRQ, /*用于定时器的下半部*/ NET_TX_SOFTIRQ, /*用于网络层发包*/ NET_RX_SOFTIRQ, /*用于网络层收报*/ BLOCK_SOFTIRQ, BLOCK_IOPOLL_SOFTIRQ, TASKLET_SOFTIRQ, /*用于低优先级的tasklet*/ SCHED_SOFTIRQ, HRTIMER_SOFTIRQ, RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ NR_SOFTIRQS };
数组的成员数由NR_SOFTIRQS
决定,是一个枚举常量。
新增一个软中断时,需要在文件include/linux/interrupt.h
softirq
即软中断,代码位于kernel/softirq.c
文件中;🎜🎜每个软中断由softirq_action</ code>结构表示:🎜<figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align- éléments : centre ;"><img src="https://img.php.cn/upload/article/001/275/014/b22f370513bb14011ce70289a459a54b-1.png"/ alt="Trois façons d'interrompre la moitié inférieure des pilotes Linux" ></figure>🎜在<code style="max-width:90%"arrière-plan : rgba (27, 31, 35, 0.05); famille de police : " Opérateur Mono", Consolas, Monaco, Menlo, monospace; coupure de mot : break-all; couleur : rgb(239, 112, 96);">softirq.c
中定义了一个软中断向量数组