español linux linux-kernel linux-device-driver

linux device drivers español



Es difícil entender el uso de MODULE_DEVICE_TABLE(usb, id_table) (3)

Aquí es cómo entiendo las cosas [compatible con Xbuntu 14.04].

Una vez que escribimos un módulo, podemos cargarlo manualmente o automáticamente.

  • Manualmente -> insmod modulename.ko o modprob modulename.ko
  • Automáticamente-> Hay múltiples formas.

    1. copie a / lib / modules / `uname -r` / kernel / modulename.ko y actualice /etc/modules . El sistema cargará el módulo durante el arranque.

    2. Escriba una secuencia de comandos / comando para cargar el módulo.ko para un evento de add / change / remove de un software específico en una regla de udev /etc/udev/rules.d/10-local.rules . Puedes hacer tanto cargar / descargar usando este método.

    3. Codifique su módulo con el registro MODULE_DEVICE_TABLE . Luego, cargue su nombre de módulo.ko una vez y ejecute el comando depmod [ sudo depmod -a ] para agregar el nuevo módulo a /lib/modules/3.16.0-34-generic/modules.alias /lib/modules/3.16.0-34-generic/modules.dep Archivos /lib/modules/3.16.0-34-generic/modules.dep . Como sé, el sistema solo se cargará si el módulo no está cargado.

Puede monitorear la carga / descarga del módulo usando eventos udev usando:

monitor udevadm

mando.

Me cuesta entender el uso exacto de MODULE_DEVICE_TABLE(usb, id_table)

Con AFAIK, esto generará los archivos de mapas que se utilizarán más adelante con modprobe cada vez que se inserte un nuevo dispositivo, los comparará con esos archivos de mapas y cargará el módulo si coincide.

Pero mi malentendido es "¿el módulo no está cargado de todos modos?"

Quiero decir que ya lo insmod module-name cuando hice insmod module-name . ¿O me estoy perdiendo algo?


Por lo general, se utiliza para admitir la conexión en caliente, al cargar / insertar el controlador para un dispositivo si aún no está cargado.

Aquí hay una pregunta similar: Detectar la presencia de un dispositivo cuando está conectado en caliente en Linux

(De mi ans)

Funciona de la siguiente manera:

  1. Cada controlador en el código expone su identificación de proveedor / dispositivo usando:

    MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);

  2. En el momento de la compilación, el proceso de compilación extrae esta información de todos los controladores y prepara una tabla de dispositivos.

  3. Cuando inserta el dispositivo, la tabla de dispositivos es referida por el kernel y si se encuentra una entrada que coincide con la identificación del dispositivo / proveedor del dispositivo agregado, entonces su módulo se carga e inicializa.


Según los controladores de dispositivos de Linux:

  1. MODULE_DEVICE_TABLE se utiliza para generar archivos de mapas por programa depmod ;
  2. Cuando el dispositivo está conectado en caliente, el controlador de bus genera un evento de conexión en caliente. El kernel llama /sbin/hotplug con las variables de entorno apropiadas establecidas;
  3. Dado los archivos de mapas y la información del entorno, /sbin/hotplug decide qué módulo cargar y en realidad lo carga. Si el módulo ya está cargado, está bien.

Debo mencionar nuevamente que este mecanismo solo garantiza que el módulo necesario esté en su lugar cuando se conecta el dispositivo. Eso no vincula el módulo con ese dispositivo o cualquier otra cosa. Solo carga el modulo.

Para verificar si el controlador está bien para un dispositivo específico, se usa la función match() de bus_type .