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

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

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

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

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