Rufen Sie eine Userspace-Funktion in einem Linux-Kernel-Modul auf

Ich programmiere einen einfachen Linux-Zeichengerätetreiber, um Daten über E / A-Ports an eine Hardware auszugeben. Ich habe eine Funktion, die Gleitkommaoperationen ausführt, um die korrekte Ausgabe für die Hardware zu berechnen; Leider bedeutet dies, dass ich diese Funktion im Userspace behalten muss, da der Linux-Kernel Gleitkommaoperationen nicht sehr gut handhabt.

Hier ist eine Pseudodarstellung des Setups (beachten Sie, dass dieser Code nichts Bestimmtes tut, sondern nur das relative Layout meines Codes zeigt):

Userspace-Funktion:

char calculate_output(char x){
    double y = 2.5*x;
    double z = sqrt(y);

    char output = 0xA3;

    if(z > 35.67){
        output = 0xC0;
    }

    return output;
}

Kernelspace-Code:

unsigned i;
for(i = 0; i < 300; i++){
    if(inb(INPUT_PORT) & NEED_DATA){
        char seed = inb(SEED_PORT);
        char output = calculate_output(seed);
        outb(output, OUTPUT_PORT);
    }

    /* do some random stuff here */
}

Ich dachte darüber nachioctl die Daten von der Userspace-Funktion übergeben, aber ich bin nicht sicher, wie ich damit umgehen soll, dass der Funktionsaufruf in einer Schleife ist und mehr Code ausgeführt wird, bevor der nächste Aufruf ancalculate_output tritt ein.

Die Art, wie ich mir das vorstelle, ist:

Das Hauptbenutzerprogramm startet den Kernelspace-Code (möglicherweise überioctl)Userspace-ProgrammBlöcke und wartet auf Kernelspace-CodeKernelspace-Programmfragt Userspace-Programm für Ausgabedaten undBlöcke wartenUserspace-Programmentsperrt, berechnet und sendet Daten (ioctl?), dannBlöcke nochmalKernelspace-Programmentsperrt und fährt fortKernelspace-Programm beendet undbenachrichtigt BenutzerraumBenutzerraumentsperrt und fährt mit der nächsten Aufgabe fort

Wie kann ich die Kommunikation zwischen Kernelspace und Userspace und die Blockierung sicherstellen, damit der Userspace nicht ständig eine Gerätedatei abfragt, um festzustellen, ob Daten gesendet werden müssen?

Eine Einschränkung: Während Festkomma-Arithmetik in meinem Beispielcode recht gut funktioniert, ist sie im realen Code keine Option. Ich benötige den großen Bereich, den Fließkommazahlen bieten, und - auch wenn dies nicht der Fall ist - ich fürchte, eine Umschreibung des Codes zur Verwendung von Festkomma-Arithmetik würde den Algorithmus für zukünftige Betreuer verschleiern.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage