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 zadanieJak 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.