0

Je travaille sur le module pour ipsec sous linux. Regardez deux situations différentes lorsque le code de mon module sera exécuté. Exécution du contexte de processus: l'application génère du trafic pour transmettre via le réseau, l'application doit appeler un appel système pour transférer les données, puis passer à l'espace noyau et le paquet passe par le sous-système réseau de linux, ici sera exécuté mon module, et tout fini après avoir donné la tâche à la carte réseau. Toutes ces étapes sont exécutées à partir du contexte du processus et, à tout moment, le planificateur peut passer d'un processus à l'autre. Est comme suit le premier cas d'utilisation de mon module - du contexte de processus.contexte d'exécution du module

Exécution à partir du contexte softirq: lorsque le paquet reçoit une carte réseau, il génère une interruption matérielle qui «prépare» le programme approprié à s'exécuter. Et le paquet passe par le sous-système réseau de Linux (y compris mon module) jusqu'à ce qu'une application l'obtienne. Ces étapes sont exécutées à partir du contexte softirq et ne peuvent être interrompues que par une interruption matérielle, mais pas par le travail du planificateur.

La question est: Comment puis-je déterminer par programme dans le module, à partir de quel module de contexte est en cours d'exécution? Cela peut être un élément de struct task_struct ou un appel système ou autre chose. Je ne pouvais pas le trouver par moi-même.

Répondre

0

est considéré comme une mauvaise pratique pour que le flux de contrôle d'une fonction dépende de son exécution dans le contexte d'interruption ou non.

Citation du développeur du noyau Linux (Andrew Morton):

Le modèle cohérent que nous utilisons dans le noyau est que les appelants garder une trace de savoir si elles sont en cours d'exécution dans un contexte planifiable et, le cas échéant, ils seront informer les collèges à ce sujet. Callees ne fonctionne pas pour eux-mêmes.


Cependant, il existe plusieurs fonctions (macros) définies dans linux/preempt.h pour détecter le contexte de la programmation actuelle: in_atomic(), in_interrupt(). Mais voir that LWN article sur leur utilisation.

+0

C'est ce que je demande, merci. Et l'explication pourquoi j'ai besoin d'une telle fonctionnalité dans mon pilote: j'écris un pilote pour CryptoApi basé sur un mécanisme asynchrone. Lorsque le conducteur reçoit une requête, il crée un travail en utilisant le mécanisme de la file d'attente de travail et renvoie un code spécial aux universités, ce qui signifie "traitement des données en cours". Callees, bien sûr, enregistrer fonction de rappel pour aller à lorsque le cryptage/décryptage des données terminée. Le travail susmentionné donne les affectations au matériel pour le traitement des données. J'ai besoin de savoir si le processus existe toujours dans le système avant que la fonction de rappel d'appel en cas de requête proviennent du processus. – yankovic

+0

Mais si la requête provient de softirq je vais passer la vérification de l'existence ou ne pas produire de travail du tout (ne pas utiliser le mécanisme asynchrone de CryptoApi). – yankovic