2009-01-10 8 views
11

Esto se relaciona con this question.¿Cuáles son las convenciones de codificación para usar punto flotante en los controladores de dispositivos Linux?

No soy un experto en controladores de dispositivos Linux o módulos kernel, pero he estado leyendo "Controladores de dispositivos Linux" [O'Reilly] por Rubini & Corbet y varias fuentes en línea, pero no he podido encontrar algo sobre este tema específico aún.

¿Cuándo se le permite a un kernel o módulo de controlador usar registros de coma flotante?
En caso afirmativo, ¿quién es responsable de guardar y restaurar sus contenidos?
(Suponga que la arquitectura x86-64)

Si he entendido bien, cada vez que un kilómetro está ejecutando, se está utilizando un contexto de hardware (o subproceso de hardware o se registra en conjunto - lo que quieras llamarlo) que ha sido apropiado de algún hilo de aplicación. Si escribe su KM en c, el compilador asegurará correctamente que los registros de propósito general se guardan y restauran correctamente (de forma muy similar a como en una aplicación), pero eso no sucede automáticamente con los registros de coma flotante. De hecho, muchos KM no pueden suponer que el procesador tenga ninguna capacidad de coma flotante.

¿Estoy en lo cierto al adivinar que un KM que quiera usar coma flotante debe guardar cuidadosamente y restaurar el estado de punto flotante? ¿Hay funciones estándar del kernel para hacer esto?

¿Las convenciones de codificación están explicadas en cualquier lugar?
¿Son diferentes para los controladores SMP sin SMP?
¿Son diferentes para los kernels no preventivos más antiguos y los kernels preventivos más nuevos?

Respuesta

8

Respuesta corta: El código del núcleo puede usar coma flotante si este uso está rodeado por kernel_fpu_begin()/kernel_fpu_end(). Estas funciones manejan guardar y restaurar el contexto de fpu. Además, llaman al preempt_disable()/preempt_enable(), lo que significa no dormir, fallas de página, etc. en el código entre esas funciones. Busca los nombres de las funciones para más información.

Si he entendido bien, cada vez que un KM está ejecutando, se utiliza una contexto de hardware (o de hilos de hardware o conjunto de registros - lo que usted quiere llamarlo) que ha sido apropiado de algunos hilo de aplicación.

No, un módulo kernel también se puede ejecutar en el contexto del usuario (por ejemplo, cuando el espacio de usuario llama a syscalls en un dispositivo provisto por el KM). Sin embargo, no tiene relación con el problema del flotador.

Si escribe su KM en C, el compilador asegurará correctamente que los registros de propósito general, se adecuadamente guardadas y restauradas (tanto como en una aplicación), pero eso no sucederá de forma automática con registros de coma flotante.

Esto no se debe al compilador, sino al código de cambio de contexto del kernel.

10

Linus's answer proporciona esta cita bastante claro para que utilicen como guía:

En otras palabras: la regla es que realmente no debería usar FP en el núcleo.

Cuestiones relacionadas