it-swarm-es.com

¿Cuál es la diferencia entre ioctl (), unlocked_ioctl () y compat_ioctl ()?

Al revisar el código fuente de Linux 2.6.36 en lxr.linux.no , no pude encontrar el método ioctl() en file_operations. En cambio, encontré dos nuevas llamadas: unlocked_ioctl() y compat_ioctl(). ¿Cuál es la diferencia entre ioctl(), unlocked_ioctl() y compat_ioctl()?

40
Sen

Meta-respuesta: Todas las cosas sin procesar que le suceden al kernel de Linux pasan por lkml (la lista de correo del kernel de Linux) . Para resúmenes explicativos, lea o busque lwn (noticias semanales de Linux) .

Respuesta: De La nueva forma de ioctl () por Jonathan Corbet :

ioctl() es una de las partes restantes del kernel que se ejecuta bajo Big Kernel Lock (BKL). En el pasado, el uso de BKL ha permitido que los métodos ioctl() de larga duración creen latencias largas para procesos no relacionados.

Sigue una explicación del parche que introdujo unlocked_ioctl y compat_ioctl en 2.6.11. El eliminación del campo ioctl sucedió mucho más tarde, en 2.6.36.

Explicación: Cuando se ejecutó ioctl, tomó Big Kernel Lock (BKL), por lo que nada más podría ejecutarse al mismo tiempo. Esto es muy malo en una máquina multiprocesador, por lo que hubo un gran esfuerzo para deshacerse del BKL. Primero, unlocked_ioctl Fue presentado. Le permite a cada escritor de controladores elegir qué bloqueo usar en su lugar. Esto puede ser difícil, por lo que hubo un período de transición durante el cual los controladores antiguos aún funcionaban (usando ioctl) pero los nuevos controladores podían usar la interfaz mejorada (unlocked_ioctl). Finalmente, todos los controladores se convirtieron y ioctl podrían eliminarse.

compat_ioctl en realidad no está relacionado, aunque se haya agregado al mismo tiempo. Su propósito es permitir que los programas de usuario de 32 bits realicen ioctl llamadas en un núcleo de 64 bits. El significado del último argumento para ioctl depende del controlador, por lo que no hay forma de hacer una conversión independiente del controlador.

Hay casos en los que el reemplazo de (include/linux/fs.h) el método struct file_operations ioctl () a compat_ioctl () en el kernel 2.6.36 no funciona (por ejemplo, para algunos controladores de dispositivo) y debe usarse unlocked_ioctl ().

4
Pawel Szyszuk