Frage

Dies bezieht sich auf diese Frage .

Ich bin kein Experte für Linux-Gerätetreiber oder Kernel-Module, aber ich habe „Drivers Linux Device“ gelesen [O'Reilly] von Rubini & Corbet und eine Reihe von Online-Quellen, aber ich habe nicht gewesen Lage noch etwas zu diesem speziellen Thema zu finden.

Wenn ein Kernel oder Treibermodul Gleitkommaregister verwenden?
Wenn ja, wer ist verantwortlich für das Speichern und Wiederherstellen ihre Inhalte?
(Es sei angenommen, x86-64-Architektur)

Wenn ich das richtig verstanden, wann immer ein KM ausgeführt wird, wird unter Verwendung eines Hardware-Kontext (oder Hardware-Thread oder registrieren gesetzt - was auch immer Sie es nennen wollen), die von einem Anwendungsthread vorbelegt ist. Wenn Sie Ihre KM in c schreiben, wird der Compiler korrekt sicherzustellen, dass die Allzweckregister ordnungsgemäß gespeichert und wiederhergestellt werden (ähnlich wie in einer Anwendung), aber das geschieht nicht automatisch mit Floating-Point-Register. Was das betrifft, übernehmen viele KMs kann nicht einmal, dass der Prozessor jede Floating-Point-Fähigkeit hat.

Bin ich vermute, korrigieren, dass eine KM, die Floating-Point nutzen will, muss sorgfältig die Floating-Point-Zustand speichern und wiederherstellen? Gibt es Standard-Kernel-Funktionen, dies zu tun?

Sind hierfür die Kodierungskonventionen überall buchstabiert? Was sind sie unterschiedlich für SMP-non SMP-Treiber? Was sind sie unterschiedlich für ältere nicht präemptiven Kernel und neueren preemptive Kernel?

War es hilfreich?

Lösung

Kurze Antwort: Kernel-Code verwenden kann Floating-Point, wenn diese Verwendung von kernel_fpu_begin() / kernel_fpu_end() umgeben ist. Diese Funktion Griff Speichern und Wiederherstellen der FPU-Kontext. Auch sie rufen preempt_disable() / preempt_enable(), die keine Schlafmittel, Seitenfehler usw. im Code zwischen diesen Funktionen. Google die Funktionsnamen für weitere Informationen.

  

Wenn ich das richtig verstanden, wann immer ein   KM ausgeführt wird, es eine Hardware verwendet   Kontext (oder Hardware-Thread oder   Registersatz - was auch immer Sie wollen   nennen es), die von preempted wurde   einige Anwendungsthread.

Nein, ein Kernel-Modul kann auch im Benutzerkontext ausgeführt (z. B. wenn User-Space ruft syscalls auf einem Gerät vom KM zur Verfügung gestellt). Es hat sich jedoch in keinem Zusammenhang mit dem Schwimmer Ausgabe.

  

Wenn Sie schreiben Ihre KM in C, die   Compiler richtig sicherzustellen, dass   die allgemeinen Register sind   ordnungsgemäß gesichert und wiederhergestellt (viel wie   in einer Anwendung), aber das bedeutet nicht   automatisch geschehen mit   Gleitkommaregister.

Das ist nicht wegen der Compiler, sondern wegen des Kernel-Kontext-Schaltcode.

Andere Tipps

Linus Antwort stellt diese ziemlich klar Zitat zu verwenden, wie eine Richtlinie:

  

Mit anderen Worten:. Die Regel ist, dass Sie wirklich nicht FP im Kernel verwenden sollten,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top