web-dev-qa-db-fra.com

Utilisation de virgule flottante dans le noyau Linux

Je lis "Linux Kernel Development" de Robert Love, et je suis tombé sur le passage suivant:

Pas (facile) d'utilisation de virgule flottante

Lorsqu'un processus en espace utilisateur utilise des instructions en virgule flottante, le noyau gère la transition du mode entier au mode virgule flottante. Ce que le noyau doit faire lors de l'utilisation d'instructions à virgule flottante varie selon l'architecture, mais le noyau intercepte normalement un piège puis initie la transition du mode entier au mode à virgule flottante.

Contrairement à l'espace utilisateur, le noyau n'a pas le luxe d'une prise en charge transparente de la virgule flottante car il ne peut pas facilement se piéger. L'utilisation d'une virgule flottante à l'intérieur du noyau nécessite, entre autres tâches, de sauvegarder et de restaurer manuellement les registres à virgule flottante. La réponse courte est: Ne le faites pas! Sauf dans les rares cas, aucune opération en virgule flottante n'est dans le noyau.

Je n'ai jamais entendu parler de ces modes "entier" et "virgule flottante". Que sont-ils exactement et pourquoi sont-ils nécessaires? Cette distinction existe-t-elle sur les architectures matérielles courantes (telles que x86), ou est-elle spécifique à certains environnements plus exotiques? Qu'implique exactement une transition du mode entier au point flottant, tant du point de vue du processus que du noyau?

74
NPE

Parce que ...

  • de nombreux programmes n'utilisent pas de virgule flottante ou ne l'utilisent pas sur une tranche de temps donnée; et
  • la sauvegarde des registres FPU et des autres états FPU prend du temps; donc

... un noyau de système d'exploitation peut simplement désactiver le FPU. Presto, aucun état à enregistrer et à restaurer, et donc un changement de contexte plus rapide. (C'est ce que le mode signifiait, cela signifiait simplement que le FPU était activé.)

Si un programme tente une opération FPU, le programme interceptera le noyau, le noyau allumera la FPU, restaurera tout état enregistré qui pourrait déjà exister, puis reviendra pour réexécuter l'opération FPU.

Au moment du changement de contexte, il sait réellement passer par la logique de sauvegarde d'état. (Et puis, cela peut à nouveau éteindre le FPU.)

Soit dit en passant, je pense que l'explication du livre pour la raison pour laquelle les noyaux (et pas seulement Linux) évitent les opérations FPU n'est ... pas parfaitement exacte.1

Le noyau peut se piéger en lui-même et le fait pour bien des choses. (Timers, défauts de page, interruptions de périphériques, autres.) La vraie raison est que le noyau n'a pas particulièrement besoin d'opérations FPU et doit également fonctionner sur architectures sans FPU du tout. Par conséquent, il évite simplement la complexité et le temps d'exécution requis pour gérer son propre contexte FPU en ne faisant pas d'opérations pour lesquelles il existe toujours d'autres solutions logicielles.

Il est intéressant de noter à quelle fréquence l'état du FPU devrait être enregistré si le noyau voulait utiliser FP ... chaque appel système, chaque interruption, chaque commutation entre même s'il y avait un besoin occasionnel de FP du noyau,2 il serait probablement plus rapide de le faire dans un logiciel.


1. C'est-à-dire que c'est faux.
2. Il y a quelques cas que je connais où le logiciel du noyau contient une implémentation arithmétique à virgule flottante . Certaines architectures implémentent des opérations FPU traditionnelles dans le matériel mais laissent des IEEE complexes = FP opérations sur le logiciel. (Pensez: arithmétique dénormale.) Quand un cas de coin IEEE étrange se produit, ils piègent le logiciel qui contient une émulation pédantiquement correcte des opérations pouvant être piégées.
75
DigitalRoss

Avec certains modèles de noyau, les registres à virgule flottante ne sont pas enregistrés lorsqu'une tâche "noyau" ou "système" est désactivée. (Ceci est dû au fait que les registres FP sont grands et prennent du temps et de l'espace pour être enregistrés.) Donc, si vous essayez d'utiliser FP, les valeurs iront "poof " au hasard.

De plus, certains schémas à virgule flottante matériels dépendent du noyau pour gérer les situations "bizarres" (par exemple, la division zéro) via un trap, et le mécanisme de trap requis peut être à un "niveau" supérieur à celui de la tâche du noyau en cours d'exécution.

Pour ces raisons (et quelques autres), certains schémas matériels FP se bloquent lorsque vous utilisez une instruction FP pour la première fois dans une tâche. Si vous ' re autorisé à utiliser FP alors un drapeau à virgule flottante est activé dans la tâche, sinon, vous êtes abattu par le peloton d'exécution).

15
Hot Licks