Wywołaj funkcję przestrzeni użytkownika z modułu jądra Linux

Programuję prosty sterownik urządzeń Linuksa do przesyłania danych do części sprzętu za pośrednictwem portów I / O. Mam funkcję, która wykonuje operacje zmiennoprzecinkowe w celu obliczenia poprawnego wyjścia dla sprzętu; niestety oznacza to, że muszę zachować tę funkcję w przestrzeni użytkownika, ponieważ jądro Linuksa nie obsługuje bardzo dobrze operacji zmiennoprzecinkowych.

Oto pseudo reprezentacja konfiguracji (zwróć uwagę, że ten kod nie robi niczego konkretnego, pokazuje jedynie względny układ mojego kodu):

Funkcja przestrzeni użytkownika:

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;
}

Kod Kernelspace:

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 */
}

Myślałem o użyciuioctl przekazać dane z funkcji przestrzeni użytkownika, ale nie jestem pewien, jak poradzić sobie z faktem, że wywołanie funkcji jest w pętli i więcej kodu wykonuje przed następnym wywołaniemcalculate_output występuje.

Sposób, w jaki to sobie wyobrażam, jest następujący:

główny program przestrzeni użytkownika uruchomi kod jądra (być może przezioctl)program przestrzeni użytkownikaBloki i czeka na kod jądraprogram kernelspacepyta program przestrzeni użytkownika dla danych wyjściowych iBloki czekaćprogram przestrzeni użytkownikaodblokowuje, oblicza i wysyła dane (ioctl?), następnieBloki jeszcze razprogram kernelspaceodblokowuje i kontynuujekończy się program kernelspace ipowiadamia przestrzeń użytkownikaprzestrzeń użytkownikaodblokowuje i kontynuuje następne zadanie

Jak więc mam komunikację między kernelspace a przestrzenią użytkownika, a także blokowanie, aby nie mieć ciągłego odpytywania pliku urządzenia przez użytkownika, aby sprawdzić, czy musi wysłać dane?

Zastrzeżenie: podczas gdy arytmetyka stałego punktu działałaby całkiem dobrze w moim przykładowym kodzie, nie jest to opcja w prawdziwym kodzie; Potrzebuję dużego zakresu, który zapewnia zmiennoprzecinkowy i - nawet jeśli nie - obawiam się, że przepisanie kodu w celu użycia arytmetyki stałego punktu spowoduje zaciemnienie algorytmu dla przyszłych opiekunów.

questionAnswers(2)

yourAnswerToTheQuestion