Chame uma função userspace de dentro de um módulo do kernel Linux

Estou programando um driver de dispositivo de caracteres Linux simples para enviar dados para um pedaço de hardware via portas de E / S. Eu tenho uma função que executa operações de ponto flutuante para calcular a saída correta para o hardware; infelizmente isso significa que eu preciso manter essa função no espaço do usuário, já que o kernel do Linux não suporta operações de ponto flutuante muito bem.

Aqui está uma pseudo representação da configuração (note que este código não faz nada específico, apenas mostra o layout relativo do meu código):

Função de espaço do usuário:

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 */
}

Eu pensei em usarioctl para passar os dados da função userspace, mas não tenho certeza de como lidar com o fato de que a chamada de função está em um loop e mais código é executado antes da próxima chamada paracalculate_output ocorre.

A maneira que eu vejo esse trabalho é:

programa principal do userspace iniciará o código do kernel (talvez através deioctl)programa userspaceBlocos e aguarda o código do kernelprograma de kernelspacepergunta programa userspace para dados de saída, eBlocos esperarprograma userspacedesbloqueia, calcula e envia dados (ioctl?), entãoBlocos novamenteprograma de kernelspacedesbloqueia e continuaprograma kernelspace termina enotifica espaço do usuárioespaço do usuáriodesbloqueia e continua na próxima tarefa

Então, como eu tenho a comunicação entre o kernelspace e o userspace, e também tenho bloqueio para que eu não tenha o espaço de usuários continuamente pesquisando um arquivo de dispositivo para ver se ele precisa enviar dados?

Uma ressalva: enquanto a aritmética de ponto fixo funcionaria muito bem no meu código de exemplo, ela não é uma opção no código real; Eu preciso do grande intervalo que o ponto flutuante fornece e - mesmo que não seja - receio reescrever o código para usar a aritmética de ponto fixo ofuscaria o algoritmo para futuros mantenedores.

questionAnswers(2)

yourAnswerToTheQuestion