¿Qué es el orden de carga del controlador integrado de Linux?


¿Cómo podemos personalizar el orden de carga del controlador incorporado (para hacer que un módulo de controlador incorporado se cargue primero y el módulo dependiente se cargue más tarde)?

4 answers

Los controladores integrados no se cargarán , por lo tanto integrados. Sus funciones de inicialización son llamadas y los controladores son activados cuando el kernel se configura. Estas funciones de inicio se llaman en init/main.c::do_initcalls(). Todas las llamadas init se clasifican en niveles, que se definen en initcall_levels y include/linux/init.h

Estos niveles son en realidad símbolos definidos en el script enlazador (arch/*/kernel/vmlinux.lds.*). En tiempo de compilación del núcleo, el enlazador recopila todas las funciones marcadas module_init() u otras *_initcall(), clasifica en niveles, pone todas las funciones en el mismo nivel juntos en el mismo lugar, y crear como una matriz de punteros de función.

Lo que hace do_initcall_level() en tiempo de ejecución es llamar a cada función apuntada por los punteros de la matriz. No hay ninguna política de llamada, excepto niveles, en do_initcall_level, pero el orden en la matriz se decide en el tiempo de enlace.

Entonces, ahora puedes ver que la orden de inicio del conductor se fija en el momento del enlace, pero ¿qué puedes hacer?

  1. ponga su función init en el nivel superior, o
  2. coloque el controlador del dispositivo en la posición más alta en Makefile

La primera es clara si has leído lo anterior. ie) use early_initcall() en su lugar si es apropiado.

El segundo necesita un poco más de explicación. La razón por la que el orden en un Makefile importa es cómo funciona el sistema de compilación del núcleo actual y cómo funcionan los enlazadores. Para hacer una historia corta, el sistema de compilación toma todos los archivos objeto en obj-y y los vincula entre sí. Es altamente dependiente del entorno, pero hay una alta probabilidad de que el enlazador coloque el primer archivo de objeto en obj-y en la dirección inferior, por lo tanto, llamado anteriormente.

Si solo desea que su controlador sea llamado antes que otros controladores en el mismo directorio, esta es la forma más sencilla de hacerlo.

 33
Author: Yasushi Shoji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 08:34:30

depmod examina los símbolos exportados y requeridos por cada módulo y hace una clasificación topológica sobre ellos que modprobe puede usar más tarde para cargar módulos en el orden adecuado. Requerir los símbolos de los módulos de los que desea depender es suficiente para hacer lo correcto.

 2
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 06:42:20

El orden correcto de los módulos y las dependencias son manejados por modprobe, incluso dentro del initrd.

 0
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 05:55:42

Recientemente tengo este problema mi controlador del cargador está teniendo dependencia del controlador ADC, por lo que antes de cargar el controlador del cargador del controlador ADC se ha cargado y comprobando la phandle adc que se define en el archivo DTS y tiene que inicializar por el controlador ADC. se resolvió cambiando el orden del módulo en drivers/Makefile

 0
Author: Nagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-25 06:05:06