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:
|
<<: WeChat-Applet + ECharts zur Realisierung eines dynamischen Aktualisierungsprozesses
Inhaltsverzeichnis 1 Element Offset-Serie 1.1 Off...
Was? Welcher Sternenmantel? Schauen wir uns zur V...
Dieser Artikel fasst die Implementierungsmethoden...
Weiterleitung zwischen zwei verschiedenen Servern...
Im Forum fragen Internetnutzer oft: „Kann ich den...
Ubuntu erlaubt standardmäßig keine Root-Anmeldung...
Update: Jetzt können Sie auf die offizielle MySQL...
1. Verschachteltes Routing wird auch als Sub-Rout...
Was ich kürzlich gelernt habe, beinhaltet Kenntni...
Wie können Sie also nach der Registrierung eines ...
Vorwort Dieser Artikel stellt hauptsächlich die d...
Verabschieden Sie sich von der Vergangenheit Bevo...
Vorwort Tatsächlich gibt es für das bescheidene „...
Vorwort Die häufigste Aufgabe nach der Installati...
1. Selenium unter Linux verwenden 1. Installieren...