Llame a una función de espacio de usuario desde dentro de un módulo del kernel de Linux

Estoy programando un controlador de dispositivo de caracteres Linux simple para enviar datos a una pieza de hardware a través de puertos de E / S. Tengo una función que realiza operaciones de punto flotante para calcular la salida correcta para el hardware; desafortunadamente, esto significa que necesito mantener esta función en el espacio de usuario ya que el kernel de Linux no maneja muy bien las operaciones de punto flotante.

Aquí hay una pseudo representación de la configuración (tenga en cuenta que este código no hace nada específico, solo muestra el diseño relativo de mi código):

Función de espacio de usuario:

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;
}

Código 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 */
}

Pensé en usarioctl para pasar los datos de la función de espacio de usuario, pero no estoy seguro de cómo manejar el hecho de que la llamada de función está en un bucle y se ejecuta más código antes de la próxima llamada acalculate_output ocurre.

La forma en que visualizo este trabajo es:

El programa principal de espacio de usuario iniciará el código de kernelspace (tal vez a través deioctl)programa de espacio de usuariobloques y espera el código kernelspaceprograma kernelspacepregunta programa de espacio de usuario para datos de salida, ybloques esperarprograma de espacio de usuariodesbloquear, calcula y envía datos (ioctl?), entoncesbloques otra vezprograma kernelspacedesbloquear y continúael programa kernelspace termina ynotifica espacio de usuarioespacio de usuariodesbloquear y continúa con la siguiente tarea

Entonces, ¿cómo tengo la comunicación entre el kernelspace y el espacio de usuario, y también tengo el bloqueo para no tener el espacio de usuario sondeando continuamente un archivo de dispositivo para ver si necesita enviar datos?

Una advertencia: si bien la aritmética de punto fijo funcionaría bastante bien en mi código de ejemplo, no es una opción en el código real; Necesito el amplio rango que proporciona el punto flotante y, aunque no lo sea, me temo que volver a escribir el código para utilizar la aritmética de punto fijo ofuscaría el algoritmo para los futuros mantenedores.

Respuestas a la pregunta(2)

Su respuesta a la pregunta