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