Linux secuencia de inicialización controlador del núcleo de ajuste

  
 

aperturas del núcleo cuando el respectivo trabajo do_basic_setup archivo de inicialización del controlador en init /main.c de la función () para hacer .static anular __init do_basic_setup (void) {/* Los conductores enviar eventos de conexión en caliente * /init_workqueues (); usermodehelper_init (); driver_init ();

#ifdef CONFIG_SYSCTLsysctl_init (); #endif

/* inicialización de una red necesita un contexto de proceso * /sock_init ();

(do_initcalls );} donde driver_init () para hacer un poco de inicialización del núcleo, inicializar vistazo al código entenderán los controladores adecuados hacen do_initcalls __init vacío .static (void) {* initcall_t llamada () en do_initcalls;. int cuenta = preempt_count ();

para (llame = __initcall_start; llamar < __initcall_end; llamar ++) {char * msg;

si (initcall_debug) {printk (KERN_DEBUG " Calling initcall 0x% p ", * llamada); print_fn_descriptor_symbol (":% s () ", (unsigned long) * llamada); printk (" \\ n ");}

(* llamada) ();

msg = NULL; if (! preempt_count () = recuento) {mensaje = " " desequilibrio de preferencia;; preempt_count () = count;} if ( irqs_disabled ()) {msg = " interrupciones deshabilitadas "; local_irq_enable ();} if (msg) {printk (KERN_WARNING " error en initcall en 0x% p: " " volvieron con% s \\ n ", * llamada , msg);}}

/* Asegúrese de que no hay cosas pendientes de la initcall secuencia * /flush_scheduled_work ();} este es el arco archivo __initcall_start /xxx /kernel /vmlinux.lds.S ( donde xxx es el nombre de su arquitectura, por ejemplo i386), este archivo se utiliza por el núcleo cuando ld que define los diferentes sectioin, para ver de entender. En este documento hay un .initcall.init, código es el siguiente :. __ = initcall_start; initcall.init: .. {* (Initcall1.init.) * (Initcall2.init.) * (Initcall3.init.) * (Initcall4. init) * (. initcall5.init) * (. initcall6.init) * (. initcall7.init)}

hay siete prioridad inicializado, el núcleo de acuerdo con este orden de prioridad de carga. estas prioridades se definen en el archivo include /linux /init.h se presta atención a la realización de la macro __define_initcall entender el código en cuestión es la siguiente: ..

#define __define_initcall (nivel, fn) \\ initcall_t estática __initcall _ ## fn __attribute_used__ \\ __ atributo __ ((__ sección __ (" .initcall " nivel de " .init "))) = fn

#define core_initcall (fn) __define_initcall (" 1 ", fn) #define postcore_initcall (fn) __define_initcall (" 2 ", fn) #define arch_initcall (fn) __define_initcall (" 3 ", fn) #define subsys_initcall (fn) __define_initcall (" 4 ", fn) #define fs_initcall (fn) __define_initcall (" 5 ", fn) #define device_initcall (fn) __define_initcall (y quot; quot;, 6 y fn) #define late_initcall (fn) __define_initcall (" quot;, 7 y fn)

Podemos ver, controladores de dispositivos, escribimos a menudo en module_init común, de hecho, corresponde a la prioridad 6: #define __initcall (fn) device_initcall (fn)

#define module_init (x) __initcall (x);

____________

pero ¿cómo me siento a su pregunta no se debe a la secuencia de carga causado? supongo. también escribí pantalla táctil impulsado, me siento un poco más serio con una pantalla táctil, y también es útil en I2C. usted debe sellar estas estructuras se forman en su coche para ir, una estructura input_dev, una es serio (o con un i2c_driver), y luego para controlar el orden de carga .module_init deberá estar inscripto i2c_driver, input_dev entonces registrada en attach_adapter tiempo.



hoy en un intento por hacer que el tiempo para usar con otra API unidad (I2C) proporcionada por un problema de dependencia encontrado durante la inicialización del núcleo.

Me haría subir y en funcionamiento antes de la inicialización I2C, y luego API I2C también se proporciona en un estado inutilizable. Disponibilidad de una gran cantidad de información, la Internet estaba empezando a decir que todo este orden usando macros conductor module_init son inciertos (no he encontrado ninguna información autorizada).

Todas las funciones __init en la sección .initcall.init también se guarda un puntero de función, en el núcleo de inicialización llama a la función de puntero __init por estos punteros de función, y después de toda la inicialización se ha completado, liberar toda la sección init (incluyendo .init.text, .initcall.init etc.).

Tenga en cuenta que el orden en que la función del núcleo llama sólo durante la secuencia de inicialización y de función punteros relacionados con el presente documento, y estas funciones 1) en sí es independiente del orden en la sección .init.text. En el kernel 2.4, que también es el orden de los punteros de función y enlaces relacionados con la orden, es incierto. 2.6 kernel, sección initcall.init 7 se divide en sub-secciones, a saber

de > .initcall1.init .initcall2.init .initcall3.init .initcall4.init .initcall5.init .initcall6. init .initcall7.initde > cuando

cuando se desea colocar la sección .initcall1.init función fn, siempre y cuando la declaración

de > core_initcall (fn); de >

puede ser.

otro método para la definición de los respectivos segmentos son:

de > core_initcall (fn) --- > .initcall1.init postcore_initcall (fn) --- > .initcall2. arch_initcall init (fn) --- > .initcall3.init subsys_initcall (fn) --- > .initcall4.init fs_initcall (fn) --- > .initcall5.init device_initcall (fn) --- >. initcall6.init late_initcall (fn) --- > .initcall7.initde >

2.4 es compatible con el initcall (fn) es equivalente a device_initcall (fn). Orden entre las respectivas sub-secciones se determinan, es decir, la primera llamada de la .initcall1.init puntero de función, a continuación, llamando a la .initcall2.init puntero de función, y similares. Secuencialmente los punteros de función en cada sub-sección y el enlace está asociado secuencia, es incierto.

Copyright © Conocimiento de Windows All Rights Reserved