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_ioctl
y compat_ioctl
en 2.6.11. La eliminación del ioctl
campo ocurrió mucho más tarde, en 2.6.36.
Explicación: Cuando ioctl
se 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_ioctl
fue 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 ioctl
pudieron eliminarse.
compat_ioctl
en 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 ioctl
llamadas en un núcleo de 64 bits. El significado del último argumento ioctl
depende del controlador, por lo que no hay forma de realizar una conversión independiente del controlador.
unlocked_ioctl
eso 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_ioctl
registran los archivos de caracteres en la inicialización del controlador despuésmknod
?