Вызов функции пользовательского пространства из модуля ядра Linux
Программирование простого драйвера символьного устройства Linux для вывода данных на аппаратное оборудование через порты ввода-вывода. У меня есть функция, которая выполняет операции с плавающей запятой, чтобы вычислить правильный вывод для оборудования; к сожалению, это означает, что мне нужно сохранить эту функцию в пользовательском пространстве, так как ядро Linux неочень хорошо справляются с операциями с плавающей запятой.
Вот's псевдопредставление установки (обратите внимание, что этот код неничего конкретного, это просто показывает относительную компоновку моего кода):
Функция пространства пользователя:
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;
}
Код ядра
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 */
}
Я думал об использованииioctl
передать данные из функции пользовательского пространства, но яЯ не уверен, как справиться с тем фактом, что вызов функции находится в цикле, и больше кода выполняется перед следующим вызовомcalculate_output
происходит.
Я представляю себе эту работу так:
основная программа пользователя запускает код пространства ядра (возможно, через)ioctl
пользовательская программаблоки и ждет код пространства ядрапрограмма ядраспрашивает пользовательская программа для вывода данных иблоки ждатьпользовательская программаразблокирует, рассчитывает и отправляет данные (ioctl
?), затемблоки сновапрограмма ядраразблокирует и продолжаетсяПрограмма kernelspace завершает работу иоповещает в пользовательском пространствев пользовательском пространстверазблокирует и продолжает к следующему заданиюТак как у меня есть связь между пространством ядра и пространством пользователя, а также блокировка, чтобы я неНеужели пользовательское пространство постоянно опрашивает файл устройства, чтобы узнать, нужно ли ему отправлять данные?
Предостережение: хотя арифметика с фиксированной точкой будет работать достаточно хорошо в моем примере кода, в реальном коде это не вариант; Мне нужен большой диапазон, который обеспечивает плавающая точка, и - даже если нет - яБоюсь, что переписывание кода с использованием арифметики с фиксированной запятой запутало бы алгоритм для будущих сопровождающих.