O que está codificando convenções para a utilização de ponto flutuante em drivers de dispositivo Linux?

StackOverflow https://stackoverflow.com/questions/431081

Pergunta

Isto está relacionado com esta questão .

Eu não sou um especialista em drivers de dispositivo Linux ou módulos do kernel, mas eu estive lendo "Linux Device Drivers" [O'Reilly] por Rubini & Corbet e um número de fontes on-line, mas eu não tenho sido capaz de encontrar qualquer coisa sobre esta questão específica ainda.

Quando é um kernel ou módulo do driver permitido o uso de registradores de ponto flutuante?
Se assim for, quem é responsável por salvar e restaurar seus conteúdos?
(Suponha arquitetura x86-64)

Se bem entendi, sempre que um KM está sendo executado, ele está usando um contexto de hardware (ou segmento de hardware ou registar set - o que você quiser chamá-lo) que foi preterido de algum segmento do aplicativo. Se você escrever seu KM em c, o compilador corretamente garantir que os registradores de uso geral são devidamente guardados e restaurados (tanto quanto em um aplicativo), mas isso não acontece automaticamente com registradores de ponto flutuante. Para essa matéria, um monte de KMS não pode sequer supor que o processador tem qualquer capacidade de ponto flutuante.

Am I corrigir em adivinhar que uma KM que quer usar ponto flutuante tem de salvar cuidadosamente e restaurar o estado de ponto flutuante? Há funções padrão do kernel para fazer isso?

são as convenções de codificação para este enunciado em qualquer lugar? Quais são eles diferentes para os motoristas SMP-não SMP? Quais são eles diferente para mais velhos kernels não-preferência e mais recentes kernels preferência?

Foi útil?

Solução

Resposta curta: código Kernel pode usar ponto flutuante se esse uso é cercado por kernel_fpu_begin() / kernel_fpu_end(). Estes identificador de função salvar e restaurar o contexto fpu. Além disso, eles chamam preempt_disable() / preempt_enable(), o que significa não dormir, falhas de página etc. no código entre essas funções. Google os nomes das funções para mais informações.

Se bem entendi, sempre que um KM está sendo executado, ele está usando um hardware contexto (ou segmento de hardware ou registar set - o que você quiser chamá-lo) que foi preterido de algum segmento do aplicativo.

Não, um módulo do kernel pode ser executado no contexto do usuário, bem como (por exemplo., Quando userspace chama syscalls em um dispositivo fornecido pelo KM). Ele tem, no entanto, nenhuma relação com a questão float.

Se você escrever seu KM em c, a compilador corretamente assegurar que os registradores de uso geral são devidamente guardados e restaurados (tanto quanto em um aplicativo), mas isso não faz acontecer automaticamente com registradores de ponto flutuante.

Isso não é por causa do compilador, mas por causa do código de comutação de contexto kernel.

Outras dicas

de Linus fornece esta citação bastante claro para uso como uma diretriz:

Em outras palavras:. A regra é que você realmente não deve usar FP no kernel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top