Quelles sont les conventions de codage pour l'utilisation de pilotes de périphérique Linux à virgule flottante?

StackOverflow https://stackoverflow.com/questions/431081

Question

Ceci est lié à cette question .

Je ne suis pas un expert des pilotes de périphérique Linux ou des modules du noyau, mais je lis "Pilotes de périphérique Linux". [O'Reilly] de Rubini & amp; Corbet et un certain nombre de sources en ligne, mais je n’ai encore rien trouvé à ce sujet.

Quand un noyau ou un module de pilote est-il autorisé à utiliser des registres à virgule flottante?
Si oui, qui est responsable de la sauvegarde et de la restauration de leur contenu?
(Supposons l'architecture x86-64)

Si je comprends bien, chaque fois qu'un KM est en cours d'exécution, il utilise un contexte matériel (ou un thread matériel ou un jeu de registres, quel que soit votre choix) qui a été préempté sur un thread d'application. Si vous écrivez votre KM dans c, le compilateur s'assurera que les registres généraux sont correctement sauvegardés et restaurés (comme dans une application), mais cela ne se produit pas automatiquement avec les registres à virgule flottante. Par ailleurs, de nombreux KM ne peuvent même pas supposer que le processeur dispose d’une capacité de virgule flottante.

Ai-je raison de penser qu'un KM qui souhaite utiliser une virgule flottante doit soigneusement sauvegarder et restaurer l'état de virgule flottante? Existe-t-il des fonctions de noyau standard pour cela?

Les conventions de codage pour cela sont-elles énoncées n'importe où?
Sont-elles différentes pour les pilotes SMP non-SMP?
Sont-ils différents pour les anciens noyaux non préemptifs et les nouveaux noyaux préemptifs?

Était-ce utile?

La solution

Réponse courte: le code du noyau peut utiliser une virgule flottante si cette utilisation est entourée par kernel_fpu_begin () / kernel_fpu_end () . Celles-ci gèrent la sauvegarde et la restauration du contexte fpu. En outre, ils appellent preempt_disable () / preempt_enable () , ce qui signifie qu’il n’ya pas de veille, de défaut de page, etc. dans le code entre ces fonctions. Google les noms de fonction pour plus d'informations.

  

Si je comprends bien, chaque fois qu'un   KM est en cours d'exécution, il utilise un matériel   contexte (ou thread matériel ou   enregistrer ensemble - tout ce que vous voulez   appelez-le) qui a été préempté de   un fil d'application.

Non, un module de noyau peut également s'exécuter dans un contexte utilisateur (par exemple, lorsque l'utilisateur appelle des appels système sur un périphérique fourni par le KM). Il n’a cependant aucun rapport avec le problème des flotteurs.

  

Si vous écrivez votre KM en c, le   le compilateur assurera correctement que   les registres à usage général sont   correctement sauvegardé et restauré (autant que   dans une application), mais cela ne veut pas   arriver automatiquement avec   registres à virgule flottante.

Ce n'est pas à cause du compilateur, mais à cause du code de changement de contexte du noyau.

Autres conseils

La réponse de Linus fournit cette citation très claire à utiliser comme une ligne directrice:

  

En d'autres termes: la règle est que vous ne devriez vraiment pas utiliser la PF dans le noyau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top