2009-01-10 10 views
11

Dies steht in Zusammenhang mit this question.Was sind Kodierungskonventionen für die Verwendung von Gleitkomma in Linux-Gerätetreibern?

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

Wann darf ein Kernel oder Treibermodul Gleitkommaregister verwenden?
Wenn ja, wer ist verantwortlich für die Speicherung und Wiederherstellung ihrer Inhalte?
(Angenommen x86-64-Architektur)

Wenn ich richtig verstehe, wann immer ein KM ausgeführt wird, wird eine Hardware-Kontext (oder Hardware-Thread oder eingestellt registrieren - was auch immer Sie es nennen wollen) verwenden, die vorbelegt wurde von einem Anwendungs-Thread. Wenn Sie Ihr KM in c schreiben, stellt der Compiler korrekt sicher, dass die Allzweckregister ordnungsgemäß gespeichert und wiederhergestellt werden (ähnlich wie in einer Anwendung), aber dies geschieht nicht automatisch bei Gleitkommaregistern. Viele KMs können nicht einmal davon ausgehen, dass der Prozessor über Fließkomma-Funktionen verfügt.

Bin ich richtig, wenn ich rate, dass ein KM, der Gleitkommazahlen verwenden will, den Gleitkommazustand sorgfältig speichern und wiederherstellen muss? Gibt es dafür Standard-Kernel-Funktionen?

Sind die Kodierungskonventionen dafür irgendwo ausgeschrieben?
Sind sie unterschiedlich für SMP-nicht SMP-Treiber?
Sind sie für ältere nicht preemptive Kernel und neuere preemptive Kernel anders?

Antwort

8

Kurze Antwort: Kernel-Code kann Fließkomma verwenden, wenn diese Verwendung von kernel_fpu_begin()/kernel_fpu_end() umgeben ist. Diese Funktion behandelt das Speichern und Wiederherstellen des fpu-Kontextes. Außerdem rufen sie preempt_disable()/preempt_enable() an, was bedeutet, dass im Code zwischen diesen Funktionen kein Schlaf, Seitenfehler usw. enthalten sind. Google die Funktionsnamen für weitere Informationen.

Wenn ich das richtig verstanden, wann immer ein KM läuft, ist es ein Hardware- Kontext (oder Hardware-Thread oder Registersatz - was auch immer Sie wollen es nennen), die von einige preempted wurde Anwendungsthread.

Nein, ein Kernel-Modul kann auch in dem Benutzerkontext ausgeführt (z. B., wenn Anwenderseite syscalls auf einem Gerät vom KM vorgesehen Anrufe). Es hat jedoch keine Beziehung zum Float-Problem.

Wenn Sie Ihren KM in c schreiben, wird der Compiler richtig versichern, dass die Allzweckregister werden richtig gespeichert und wiederhergestellt (viel wie in einer Anwendung), aber das bedeutet nicht automatisch geschehen mit Gleitkommaregistern.

Das ist nicht wegen des Compilers, aber wegen des Kernel-Kontext-Switching-Codes.

10

Linus's answer bietet dieses ziemlich klar Zitat als Richtlinie zu verwenden:

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