2011-04-14 30 views
11

Si tengo dos módulos que están siendo enlazados estáticamente. La función module_init de un módulo depende de que la función module_init de otro módulo ya se haya ejecutado. ¿Hay alguna manera de forzar que un módulo se cargue antes que el otro?LINUX: orden del módulo enlazado estáticamente cargando

Además, ¿está garantizada la finalización de la función init del primer módulo antes de invocar el segundo?

Por último, si la respuesta a lo anterior es NO, ¿cuál es la forma recomendada de sincronizar las llamadas de inicio de dos módulos para asegurarme de que no tenga problemas?

+0

1) ¿Qué idioma/cadena de herramientas, 2) ¿Quiere decir vinculado a un .so o un .a? – Erik

+1

¿Te refieres a dos módulos de kernel de Linux? ¿Cómo están enlazados estáticamente? No puede vincular estáticamente dos objetos juntos con una función "módulo_inicio". –

+1

Creo que owen lo tiene, dado que el símbolo 'module_init' es una parte integral del sistema de módulos kernel de Linux. @John deberías editar tu pregunta e incluir la etiqueta 'linux-kernel' - la etiqueta' linux' está (desafortunadamente) dominada por problemas del espacio de usuario, a menudo ni siquiera es específica de Linux. –

Respuesta

0

Asumo que quiere fijar el fiasco de inicialización estática

Tenga una mirada en

Static Initialization Order Fiasco

+0

Habla de los módulos del kernel de Linux; todas sus soluciones tienen que ver con el espacio de usuario de C++. –

+0

@Eric: oops, gracias por notarlo. Lo extrañé por completo ... Supuse los nombres extraños (module_init) en algún tipo de exótico sabor UNIX :) – sehe

12

¿Hay una manera de forzar un módulo a cargar antes que el otro?

respuesta es sorprendentemente simple, asegúrese primer módulo es el primero en Makefile:

obj-y += mod1.o 
obj-y += mod2.o 

es función init del primer módulo garantiza que terminar antes de invocar el segundo?

Sí, las llamadas initcalls (module_init gancho) en su caja se llaman una a una. Consulte init/main.c, do_one_initcall() llamadas.

+1

Esta solución no funcionará para módulos definidos en Makefiles diferentes. ¿Alguna solución para el caso de que los dos módulos se compilan en diferentes Makefiles? – talel

+0

@talel Generalmente, hay un Makefile superior para definir la secuencia para descender en los directorios y un Makefile de arco para definir secciones específicas del arco. Puede buscar esos init-y, core-y, drivers-y, etc. en esos Makefiles. También este artículo puede ser útil para usted. http://www.kernel.org/doc/Documentation/kbuild/makefiles.txt – ywu

Cuestiones relacionadas