Вызов функции пользовательского пространства из модуля ядра 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 завершает работу иоповещает в пользовательском пространствев пользовательском пространстверазблокирует и продолжает к следующему заданию

Итак, как мне установить связь между пространством ядра и пространством пользователей, а также блокировать, чтобы у меня не было пользовательского пространства, постоянно опрашивающего файл устройства, чтобы узнать, нужно ли ему отправлять данные?

Предостережение: хотя арифметика с фиксированной точкой будет работать достаточно хорошо в моем примере кода, в реальном коде это не вариант; Мне требуется большой диапазон, который обеспечивает плавающая точка, и - даже если нет - я боюсь, что переписывание кода с использованием арифметики с фиксированной точкой приведет к запутыванию алгоритма для будущих сопровождающих.

Ответы на вопрос(2)

Ваш ответ на вопрос