75 votes

Utilisation de la virgule flottante dans le noyau Linux

Je suis en train de lire l'ouvrage de Robert Love "Linux Kernel Development", et je suis tombé sur le passage suivant :

Pas d'utilisation (facile) de la virgule flottante

Lorsqu'un processus de l'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 lorsqu'il utilise des instructions en virgule flottante varie selon l'architecture, mais le noyau attrape normalement un piège et initie alors 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 lui-même. L'utilisation d'une virgule flottante au sein du noyau nécessite de sauvegarder et de restaurer manuellement les registres de virgule flottante, parmi d'autres tâches possibles. La réponse courte est la suivante : Ne le faites pas ! Sauf dans de rares cas, aucune opération en virgule flottante n'est effectuée dans le noyau.

Je n'ai jamais entendu parler de ces modes "entier" et "virgule flottante". De quoi s'agit-il 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 mode virgule flottante, à la fois du point de vue du processus et du noyau ?

78voto

DigitalRoss Points 80400

Parce que...

  • de nombreux programmes n'utilisent pas la virgule flottante ou ne l'utilisent pas à un moment donné ; y
  • La sauvegarde des registres et autres états de la FPU prend du temps ; par conséquent

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

Si un programme tente d'exécuter une opération FPU, le programme est piégé dans le noyau, le noyau active la FPU, restaure tout état sauvegardé existant, puis revient pour réexécuter l'opération FPU.

Au moment du changement de contexte, il sait qu'il doit passer par la logique de sauvegarde d'état. (Et ensuite, il est possible qu'il éteigne à nouveau le FPU).

D'ailleurs, je crois que l'explication du livre sur la raison pour laquelle les noyaux (et pas seulement Linux) évitent les opérations FPU n'est pas tout à fait exacte. 1

Le noyau peut se referme sur lui-même et le fait pour de nombreuses choses. (La vraie raison est que le noyau n'est pas particulièrement sensible aux problèmes de sécurité. besoin FPU et doit également fonctionner sur des architectures dépourvues de FPU. Par conséquent, il évite simplement la complexité et le temps d'exécution nécessaires pour gérer son propre contexte FPU en n'effectuant pas les opérations pour lesquelles il existe toujours d'autres solutions logicielles.

Il est intéressant de noter combien de fois l'état de la FPU devrait être sauvegardé si le noyau voulait utiliser la FP . . . chaque appel système, chaque interruption, chaque commutation entre les threads du noyau. Même s'il était nécessaire d'avoir une FP occasionnelle dans le noyau, 2 il serait probablement plus rapide de le faire dans un logiciel.


1. C'est-à-dire, se trompent lourdement.
2. Il y a quelques cas que je connais où le logiciel du noyau contient une arithmétique à virgule flottante. la mise en œuvre. Certaines architectures mettent en œuvre les opérations FPU traditionnelles dans le matériel, mais laissent certaines opérations FP IEEE complexes au logiciel. (Pensez-y : arithmétique dénormale). Lorsqu'un cas particulier de l'IEEE se produit, ils se connectent à un logiciel qui contient une émulation pédante et correcte des opérations qui peuvent être piégées.

15voto

Hot Licks Points 25075

Avec certaines conceptions de noyau, les registres à virgule flottante ne sont pas sauvegardés lorsqu'une tâche "noyau" ou "système" est abandonnée. (Cela s'explique par le fait que les registres FP sont volumineux et qu'il faut du temps et de l'espace pour les sauvegarder). Par conséquent, si vous tentez d'utiliser les registres à virgule flottante, les valeurs disparaîtront de manière aléatoire.

En outre, certains systèmes matériels de virgule flottante reposent sur le noyau pour gérer les situations "bizarres" (par exemple, la division par zéro) via un piège, et le mécanisme de piège requis peut se situer à 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 FP matériels se bloquent lorsque vous utilisez une instruction FP pour la première fois dans une tâche. Si vous êtes autorisé à utiliser FP, un drapeau de virgule flottante est activé dans la tâche, sinon vous êtes fusillé par le peloton d'exécution.

0voto

tjarco Points 3

Je tombe sur ce résultat concernant l'utilisation de la virgule flottante dans le kernelspace. Ce que je me demande, c'est s'il ne s'agit pas d'une "vieille" implémentation (compatibilité) à cause des anciennes architectures dans lesquelles un FPU dédié est implémenté et les instructions FPU sont externalisées vers un "co-processeur" physique ayant leurs propres pipelines ?

Je peux imaginer qu'une telle architecture devrait traiter différemment les instructions "externalisées" en raison des délais de pipeline et autres, mais si je me souviens bien, les architectures actuelles (Arm.v8) ont leurs instructions IEEE754 comme partie intégrante du jeu d'instructions, et non pas comme un module FPU externe. Il n'est donc pas possible de l'activer ou de le désactiver, et il n'y a pas non plus de problème de délais de pipeline. Oui, il y a probablement un registre CORE qui doit être sauvegardé/restauré, mais cela semble négligeable (comparé à la surcharge de la gestion de la pile).

À mon avis, il n'y a pas d'argument pour ne pas utiliser les flottants dans le noyau. Comme il a été dit plus haut, il est déjà utilisé dans l'espace noyau pour le RAID.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X