Maison > Opération et maintenance > exploitation et maintenance Linux > Trois façons d'interrompre la moitié inférieure des pilotes Linux

Trois façons d'interrompre la moitié inférieure des pilotes Linux

Libérer: 2023-07-31 14:57:18
avant
1036 Les gens l'ont consulté

Quelle est la seconde moitié de l'interruption

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 première partie est le gestionnaire d'interruptions (moitié supérieure), et le noyau termine le traitement des interruptions matérielles grâce à son exécution asynchrone. Réponse instantanée.
  • L'autre partie du processus de gestion des interruptions, moitié inférieure(moitié inférieure)

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 .

Trois façons d'interrompre la moitié inférieure des pilotes Linux

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中,对中断下半部的实现主要有三种:

  • 软中断
  • tasklet
  • 工作队列

softirq

softirq即软中断,代码位于kernel/softirq.c文件中;

每个软中断由softirq_action结构表示:

Trois façons d'interrompre la moitié inférieure des pilotes Linux

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  
   };
Copier après la connexion

数组的成员数由NR_SOFTIRQS决定,是一个枚举常量。

新增一个软中断时,需要在文件include/linux/interrupt.h

  • 软中断

  • tasklet

    🎜
  • 工作队列🎜🎜🎜🎜

    softirq

    🎜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中定义了一个软中断向量数组