es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo manejar la eliminación de dispositivos en el controlador del kernel de Linux?

Lo has hecho mil veces: desconectas algún equipo USB y cualquier dispositivo asociado con ese equipo USB es eliminado por el controlador. Cualquier programa que use un controlador de archivo previamente abierto recibirá un error. De alguna manera, la mayoría de los controladores de Linux se encargan de eso.

Actualmente estoy luchando por implementar lo mismo en un controlador simple. Mi controlador crea un dispositivo de caracteres. Cuando se abre el dispositivo, establezco el miembro private_data de struct file en la dirección de algunos datos de gestión que existen una vez por dispositivo de caracteres. Esos datos de gestión también incluyen un mutex que uso para sincronizar operaciones como read, write e ioctl.

El problema surge cuando se desconecta el equipo USB. No debo liberar la memoria donde vive esos datos de gestión. Primero, cualquier llamada en ejecución a read, write o ioctl debe finalizar. Cualquier llamada en ejecución probablemente también mantendrá un bloqueo en el mutex e intentará desbloquearlo. Así que se accederá a la memoria donde vive el mutex.

Cualquier llamada posterior a read, write o ioctl posterior a la desconexión del equipo USB debe fallar, por lo que cada llamada debe leer una variable que indique si el equipo USB aún está conectado o no. Nuevamente, esa variable debe vivir en algún lugar y la memoria donde vive debe permanecer asignada mientras haya controladores de archivo abiertos.

En resumen, me parece que debo hacer algún tipo de recuento de referencia: Los datos de gestión deben permanecer asignados hasta que se cierren todos los controladores de archivo. Podría implementarlo yo mismo, pero tengo la sensación de que estaría reinventando la rueda. Eso ya debe existir, no soy el primero en tener este problema.

¿Linux lleva un seguimiento interno del número de controladores de archivo abiertos? ¿Puedo definir una devolución de llamada que se llame cuando se hayan cerrado todos los controladores de archivo? ¿Es eso incluso viable? ¿Cuál es la manera correcta de eliminar un dispositivo de caracteres del sistema?

Las variables globales no deben evitarse, ya que se pueden conectar cualquier cantidad de dispositivos USB.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en el kernel de Linux, USB y los controladores de dispositivos Linux, entiendo el problema que surge al desconectar equipos USB y el controlador asociado eliminando cualquier dispositivo. La mayoría de los controladores de Linux cuidan este problema, pero surge el problema al implementarlo en un controlador sencillo que crea un dispositivo de caracteres. En este caso, cuando se desconecta el equipo USB, los datos de gestión no deben liberarse inmediatamente. En su lugar, se debe implementar un recuento de referencia para mantener los datos de gestión asignados hasta que se cierren todos los identificadores de archivo.

    Para abordar este problema, Linux lleva internamente un control del número de identificadores de archivo abiertos. Además, se puede definir y llamar a un callback cuando se han cerrado todos los identificadores de archivo. Esto se puede hacer utilizando el campo release en la estructura struct file_operations para definir una función que se llama cuando se cierra el último descriptor de archivo para el dispositivo. Esta función se puede utilizar para liberar cualquier recurso utilizado por el controlador, incluidos los datos de gestión.

    Es importante tener en cuenta que se deben evitar las variables globales ya que se pueden conectar cualquier número de dispositivos USB y el uso de variables globales puede causar conflictos entre diferentes instancias del controlador. La forma adecuada de eliminar un dispositivo de caracteres del sistema es llamar a la función unregister_chrdev después de que se hayan cerrado todos los identificadores de archivo y se hayan liberado los recursos.

    En resumen, se debe implementar un recuento de referencia para mantener los datos de gestión asignados hasta que se cierren todos los identificadores de archivo. Linux lleva internamente un control del número de identificadores de archivo abiertos y se pueden definir y llamar a callbacks cuando se han cerrado todos los identificadores de archivo. Se deben evitar las variables globales y se debe llamar a la función unregister_chrdev para eliminar un dispositivo de caracteres del sistema.

Comments are closed.