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


38

Al revisar el código fuente de Linux 2.6.36 en lxr.linux.no , no pude encontrar el ioctl()método 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()?

Respuestas:


39

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.


1
Estaba mirando la última fuente de ioctl y vi que el syscall hace algunas comprobaciones y luego salta aquí . ¿Sabes dónde podría reunir más información sobre el sistema ioctl? Estoy interesado en cómo los comandos ioctl en los archivos de caracteres se enrutan al controlador apropiado. ¿Es por unlocked_ioctleso que esto sucede? El hecho de que se use un puntero de función por archivo (en este caso a struct file) parece que puedo estar cerca. ¿Se unlocked_ioctlregistran los archivos de caracteres en la inicialización del controlador después mknod?
sherrellbc

1
@sherrellbc El controlador de dispositivo registra los métodos de manejo de archivos, como unlocked_ioctlen un struct file_opscuando se inicia, y se rellenan desde el struct file_opsobjeto de archivo cuando se abre el archivo. mknodNo juega ningún papel en esto.
Gilles 'SO- deja de ser malvado'

Veo. Estaba pensando que un controlador de dispositivo debe primero 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 de unlocked_ioctl).
sherrellbc

4

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 ().

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.