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 núcleo que se ejecuta bajo Big Kernel Lock (BKL). En el pasado, el uso de BKL ha permitido que los ioctl()métodos de larga duración creen latencias largas para procesos no relacionados.
Sigue una explicación del parche que se introdujo unlocked_ioctly compat_ioctlen 2.6.11. La eliminación del ioctlcampo ocurrió mucho más tarde, en 2.6.36.
Explicación: Cuando ioctlse ejecutó, tomó el 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_ioctlfue presentado. 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 todavía funcionaban (usando ioctl) pero los nuevos controladores podían usar la interfaz mejorada ( unlocked_ioctl). Finalmente, todos los controladores se convirtieron y ioctlpudieron eliminarse.
compat_ioctlen realidad no está relacionado, a pesar de que se agregó al mismo tiempo. Su propósito es permitir que los programas de usuario de 32 bits realicen ioctlllamadas en un núcleo de 64 bits. El significado del último argumento ioctldepende del controlador, por lo que no hay forma de realizar una conversión independiente del controlador.
unlocked_ioctleso que esto sucede? El hecho de que se use un puntero de función por archivo (en este caso astruct file) parece que puedo estar cerca. ¿Seunlocked_ioctlregistran los archivos de caracteres en la inicialización del controlador despuésmknod?unlocked_ioctlen unstruct file_opscuando se inicia, y se rellenan desde elstruct file_opsobjeto de archivo cuando se abre el archivo.mknodNo juega ningún papel en esto.mknodexponer su interfaz a través de un dispositivo de caracteres antes de redirigir las operaciones de archivo asociadas a sí mismo (a través deunlocked_ioctl).Hay casos en los que el reemplazo de (include / linux / fs.h) el método struct file_operations ioctl () por compat_ioctl () en el kernel 2.6.36 no funciona (por ejemplo, para algunos controladores de dispositivo) y debe usarse unlocked_ioctl ().
fuente