Eine kurze Erläuterung der Unterstützung von Gleitkommaoperationen durch den Linux-Kernel

Eine kurze Erläuterung der Unterstützung von Gleitkommaoperationen durch den Linux-Kernel

Derzeit unterstützen die meisten CPUs Gleitkommaeinheiten (FPUs). FPUs werden außerhalb des Prozessorkerns als separater Coprozessor platziert. Bei eingebetteten Prozessoren werden Gleitkommaoperationen jedoch selten verwendet, sodass bei einigen eingebetteten Prozessoren der Gleitkomma-Coprozessor entfernt wird.

X86-Prozessoren haben im Allgemeinen FPU. Der ARM PPC MIPS-Prozessor verfügt jedoch nicht über eine FPU.

Wie der Linux-Kernel mit Gleitkommaoperationen umgeht, kann anhand von Prozessoren mit und ohne FPU erläutert werden.

(Das Folgende ist eine Zusammenfassung meines persönlichen Wissens. Ich habe nicht viel recherchiert. Ich hoffe, Sie können auf Fehler hinweisen und gemeinsam lernen.)

1. Für Prozessoren mit FPU

1 Für den Linux-Kernel wird der Kernel selbst standardmäßig mit der Option -msoft-float kompiliert und standardmäßig als Soft-Float-Programm kompiliert. Soft-Float bedeutet, dass der gcc-Compiler Gleitkommaoperationen simuliert (bereitgestellt durch die glibc-Bibliothek) und Gleitkommaoperationscodes durch Festkommaoperationen ersetzt.

Bei Prozessoren mit FPU können wir die Kompilierungsoption -msoft-float entfernen, normalerweise in arch/xxx/Makefile. Kompilieren Sie den Kernel als harte Gleitkommazahlen, d. h. lassen Sie die Gleitkommaanweisungen des Prozessors Gleitkommazahlen berechnen.

Harte Gleitkommaoperationen sind definitiv effizienter als simulierte Festkommaoperationen. (Im Kernelcode gibt es im Allgemeinen keine Gleitkommaoperationen, sodass die Effizienz nicht stark beeinträchtigt wird.)

2 Für Apps, die auf dem Kernel ausgeführt werden, insbesondere für Grafikprogramme wie QT, die viele Gleitkommaoperationen haben, können wir sie direkt kompilieren, da der Prozessor Gleitkommaoperationen und Anweisungen für Gleitkommaoperationen unterstützt.

2. Für Prozessoren ohne FPU

1 Für den Linux-Kernel wird beim Kompilieren standardmäßig die Option -msoft-float verwendet, und das Programm wird standardmäßig als Soft-Fließkommaprogramm kompiliert. Die Kompilierung des Linux-Kernels erfordert keine Verknüpfung einer Bibliothek, und der Kernel implementiert die entsprechende simulierte Fließkomma-ABI.

2 Für Apps, die auf dem Kernel ausgeführt werden, gibt es zwei Möglichkeiten, Gleitkommaoperationen zu verarbeiten:

(1) Der Kernel simuliert Soft-Floating-Point-Verfahren.

Die Anwendung wird direkt unter Verwendung von harten Gleitkommazahlen kompiliert (der Compiler kompiliert standardmäßig in ein Programm mit harten Gleitkommazahlen).

Was den Kernel betrifft, verfügen alle mir bekannten PPC-MIPS-Prozessoren über eine spezielle Ausnahmebehandlung für Gleitkommaoperationen. Wenn das Programm auf eine Gleitkommaanweisung stößt und diese nicht ausführen kann, generiert die Hardware eine entsprechende Interrupt-Ausnahme. Der Gleitkomma-Ausnahmehandler des Kernels führt basierend auf dem Anweisungsinhalt weiche Gleitkomma-Simulationsoperationen aus, gibt das Operationsergebnis zurück und stellt dann die Ausführung im Benutzerbereich wieder her.

Für ARM habe ich in der Ausnahmeeinführung keinen Ausnahmeeintrag für Gleitkommaberechnungen gefunden, aber der Kernel bietet auch Unterstützung für dessen Soft-Gleitkomma.

Beim Konfigurieren des ARM-Linux-Kernels sollten Sie die folgende Konfiguration sehen:

 Menü „Gleitkomma-Emulation“
 Kommentar "Es muss mindestens eine Emulation ausgewählt werden"
 Konfiguration FPE_NWFPE
  ...

Dies wird verwendet, um den simulierten Gleitkommaprozessor im Kernel zu konfigurieren.

Wie ARM die Unterstützung für die Ausnahmesimulation von Soft-Gleitkommazahlen implementiert, muss bei Bedarf sorgfältig im Code in Arch/Arm/NWFPE gelesen werden.

Der Vorteil dieser Methode besteht darin, dass die Anwendung nicht neu kompiliert werden muss und die Gleitkommasimulation nur im Kernel aktiviert werden muss, was sehr praktisch ist.

Allerdings liegen auch die Nachteile auf der Hand: Jede Gleitkommaoperation löst eine Interrupt-Ausnahme aus, wechselt zwischen Benutzer- und Kernelspeicher und die Ausführungseffizienz ist zu gering.

(2) Kompilieren Sie die App neu mit Soft-Floating-Point

Dadurch können die oben genannten Probleme vermieden werden. Beim Kompilieren der App müssen Sie eine Verbindung zur glibc-Bibliothek herstellen. Verwenden Sie --msoft-float, um die simulierten Gleitkommaoperationen von glibc anstelle von Festkommaoperationen zu verwenden. Dies hat den Vorteil, dass die Laufleistung besser ist.

Der Nachteil besteht jedoch darin, dass sich die verwendete ABI aufgrund der Verwendung unterschiedlicher Kompilierungsoptionen ändern kann. Wenn eine Bibliothek oder Anwendung nicht dieselben Kompilierungsoptionen verwendet (unterschiedliche ABI),

Während des Systembetriebs können unerwartete Situationen auftreten und das System kann sogar abstürzen.

Laut den jüngsten Debugaufzeichnungen eines PPC-Prozessors startete der Kernel normal und betrat die Konsole, stürzte jedoch an einer bestimmten Adresse ab. Es gab viele Gleitkommaoperationen im Benutzerbereich. Nach der Abfrage des IC wurde festgestellt, dass die FPU entfernt und die Gleitkommaausnahme des Prozessors nicht aktiviert war.

Auf diese Weise löst der Prozessor beim Auftreten einer Gleitkommaanweisung keine Ausnahme aus und weiß nicht, wie er die Anweisung ausführen soll.

Daher müssen Sie beim Portieren des Kernels auch wissen, ob der Prozessor über eine FPU verfügt. Wenn der Prozessor die FPU entfernt und der Kern keine entsprechende Verarbeitung durchführt (Fließkommaausnahmen aktiviert), sind die Ergebnisse der Fließkommaanweisungen der APP unvorhersehbar. In diesem Fall können Sie zum Kompilieren der APP eine Soft-Fließkomma-Toolchain verwenden.

Hier ist ein kleiner Gedanke:

Wenn bei einem Prozessordesign eine Gleitkommaausnahme vorliegt (beide MIPS PPC haben sie), kann dieser auch an eine FPU angeschlossen werden.

Nach der Verbindung mit der FPU müssen Gleitkommaausnahmen im Prozessorkern abgeschirmt werden, da sonst Gleitkommaoperationen weiterhin Gleitkommaausnahmen erzeugen und die FPU keine praktische Bedeutung hat.

Wenn keine FPU vorhanden ist, müssen Gleitkomma-Ausnahmen im Prozessorkern aktiviert werden. Andernfalls tritt das gleiche Problem auf wie das oben beschriebene. Der Prozessor weiß nicht, wie er die Gleitkomma-Anweisung ausführen soll, und das Ergebnis ist unvorhersehbar.

Die obige kurze Diskussion über die Unterstützung von Gleitkommaoperationen durch den Linux-Kernel ist alles, was ich mit Ihnen teilen möchte. Ich hoffe, dass sie Ihnen als Referenz dienen kann. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • So installieren Sie gcc und kernel-devel im Linux-System
  • Verwenden Sie die vom Kernel bereitgestellte Schnittstelle, um die Prozessnummer (PID) auszudrucken.
  • Eine kurze Erläuterung zum Drucken des Funktionsaufrufstapels im Linux-Kernel
  • So drucken Sie den Funktionsnamen, der dem Funktionszeiger im Linux-Kernel entspricht
  • Erfahren Sie, wie Sie mit NEON Algorithmen im Kernelzustand beschleunigen können
  • Analyse des Problems „HVM-Kernel für Ubuntu-Baum konnte nicht gefunden werden.“ bei der Installation von 64-Bit-Ubuntu unter der KVM-Befehlszeile in Ubuntu
  • CentOS7-Upgrade des Kernels kernel5.0 Version
  • Lösung des Konflikts zwischen Linux-Kernel- und SVN-Versionen

<<:  WeChat-Applet + ECharts zur Realisierung eines dynamischen Aktualisierungsprozesses

>>:  Tutorial zum Installieren und Ändern des Root-Passworts der dekomprimierten Version von MySQL 5.7.20

Artikel empfehlen

Detaillierte Erklärung dreier häufig verwendeter Webeffekte in JavaScript

Inhaltsverzeichnis 1 Element Offset-Serie 1.1 Off...

Beispiel für Sterne für den CSS-Bewertungseffekt

Was? Welcher Sternenmantel? Schauen wir uns zur V...

Html+css, um reinen Text und Schaltflächen mit Symbolen zu erreichen

Dieser Artikel fasst die Implementierungsmethoden...

Zusammenfassung der Methoden zum Einbinden von Dateiinhalten in HTML-Dateien

Im Forum fragen Internetnutzer oft: „Kann ich den...

Eine kurze Analyse zum Festlegen des Anfangswerts des Linux-Roots

Ubuntu erlaubt standardmäßig keine Root-Anmeldung...

Vue implementiert ein Beispiel für eine verschachtelte Routing-Methode

1. Verschachteltes Routing wird auch als Sub-Rout...

MySQL 8.0.15 Installations- und Konfigurations-Tutorial unter Win10

Was ich kürzlich gelernt habe, beinhaltet Kenntni...

Erste Schritte Tutorial für Anfänger: Domänennamenauflösung und Bindung

Wie können Sie also nach der Registrierung eines ...

Implementierung der Remote-Linux-Entwicklung mit vscode

Verabschieden Sie sich von der Vergangenheit Bevo...

Zusammenfassung der unbekannten Verwendung von "!" in Linux

Vorwort Tatsächlich gibt es für das bescheidene „...

So zeigen Sie verfügbare Netzwerkschnittstellen in Linux an

Vorwort Die häufigste Aufgabe nach der Installati...