2012-07-25 7 views

Respuesta

29

Los controladores incorporados no serán cargados, por lo tanto incorporados. Se llaman sus funciones de inicialización y los controladores se activan cuando kernel se configura a sí mismo. Estas funciones init 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 símbolos reales definidos en la secuencia de comandos del enlazador (arch/*/kernel/vmlinux.lds.*). En el tiempo de compilación del kernel, el enlazador recoge todas las funciones marcadas module_init() u otras *_initcall(), clasifica en niveles, coloca todas las funciones en el mismo nivel juntas en el mismo lugar y crea como una matriz de punteros a función.

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

Entonces, ahora puede ver que la orden de iniciación del controlador está fijada en el momento del enlace, pero ¿qué puede hacer?

  1. poner su función init en el nivel más alto, o
  2. poner el controlador de dispositivo en la posición más alta en Makefile

El primero de ellos está claro si ha leído lo anterior. es decir, use early_initcall() en su lugar si es apropiado.

El segundo necesita un poco más de explicación. La razón por la cual el orden en un asunto Makefile es cómo funciona el sistema actual de compilación de kernel y cómo funcionan los enlazadores. Para abreviar, el sistema de compilación toma todos los archivos de objeto en obj-y y los une. Es altamente dependiente del entorno pero hay una alta probabilidad de que el enlazador coloque el primer archivo de objeto en el obj-y en una dirección inferior, por lo tanto, se llama antes.

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

+0

¡Gracias a @Yasushi Shoji por su detallada explicación! –

+0

¡Este es un ejemplo de una excelente respuesta! – VividD

0

El orden correcto de los módulos y las dependencias se manejan mediante modprobe, incluso dentro del initrd.

2

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

0

Recientemente recibí este problema el controlador de mi cargador está teniendo dependencia del controlador ADC así que antes de cargar el controlador de carga del controlador ADC, cargue y verifique que adc phandle esté definido en el archivo DTS y tenga que inicializarlo mediante el controlador ADC. se resolvió cambiando el orden del módulo en los controladores/Makefile

Cuestiones relacionadas