Iniciar el proceso de entrar en el brazo del núcleo de Linux

  

o generado a partir del proceso de compilación y enlazado vmlinux visualizarla, unidos por un grupo de .o archivo se hace, el primero es el núcleo \\ arco \\ brazo \\ kernel \\ cabeza ArMV. O, pero también vemos un archivo de enlace lds kernel \\ arco \\ brazo \\ vmlinux.lds, se debe analizar la primera entrada (sText) //punto de entrada es sText estaría en las cabeceras de armv.s en secciones {. = 0xC0008000; //dirección base, la dirección virtual del núcleo comienza a .init: {/* Init co de y da ta * /_ = sText; __ init_begin =; * (text.init.) __ proc_info_begin = ...; * (. proc.info) __ proc_info_end =;. __ arch_info_begin =;. * __ arch_info_end =;. __ tagtable_begin =;. * __ tagtable_end =;. * (da ta.init (arch.info.) (taglist.). .) = ALIGN (16); __ setup_start =;. * (setup.init) __ = setup_end; .. __ initcall_start =;. * (initcall.init) __ = initcall_end; ... = ALIGN (4096); __ init_end =};. Acerca de dirección virtual y la dirección física: MMU después de su uso, el sistema utilizará la dirección virtual mediante la MMU para que apunte a la dirección física real en nuestra dirección física real es 0x3000 0xC0008000 8000, introdujo una referencia específica a "arquitectura ARM y programación" en la MMU. .Sección de entrada de cabeza armv.s para encontrar el programa de " quot;, .text.init y alloc #, # execinstr.type sText, #functionENTRY (sText) mov r12, r0mov r0, #F_BIT |  I_BIT |  MODE_SVC @ asegurarse SVC modemsr cpsr_c, r0 @ y todas las IRQ disabledbl __lookup_processor_typeteq r10, # 0 @ procesador inválida? MOVEQ r0, # 'p' @ sí, el error 'p'beq __errorbl __lookup_architecture_typeteq R7, # 0 @ arquitectura no válida? MOVEQ r0 , # 'a' @ sí, el error 'a'beq __errorbl __create_page_tablesadr LR, __ret @ volver addressadd PC, R10, # 12 @ procesador de inicialización dónde buscar fantasía para perseguir un salto en el valor de R10, en __lookup_processor_type Funciones en Fu __lookup_processor_type: dirección base r5 adr, 2f //referencia r5 numeral 2 es r5 0x30008000ldmia, {r7, R9, R10} //r7 = __ proc_info_end r9 = __ proc_info_beginsub R5, R5, R10 //R10 numeral 2 la base dirección del enlace es 0xc0008000add r7, r7, r5 @ a nuestra dirección spaceadd r10, r9, r5 //r10 convertida en la dirección de base es 0x30008000 __proc_info_begin2: .long __proc_info_end.long __proc_info_begin.long 2b se almacena en tales r10 __proc_info_begin dirección, porque ahora no tenemos que abrir la MMU que todavía tienen que ser transformados a la dirección base 0x30008000, y luego fuimos a __proc_inf o_begin se notó en los vmlinux.lds anteriores en esta etiqueta, el enlace está inactivo .proc.info segmento, en kernel \\ arco \\ brazo \\ mm \\ proc-arm920.s encontraron el último párrafo .Sección ". proc.info ", #alloc, #execinstr

.type __arm920_proc_info, # object__arm920_proc_info: .long 0x41009200.long 0xff00fff0.long 0x00000c1e @ mmuflagsb __arm920_setupok, por lo que sabemos que añadir PC, R10, # 12, donde el salto ir, porque la barra de direcciones sólo hay que poner una instrucción de salto en cuenta la declaración de b es una dirección relativa, no se requiere la conversión de direcciones, ya que es saltar __arm920_setup, pero la declaración se adr LR, __ret, establece __arm920_setup devolver dirección es __ret, por lo que después de ejecutar __arm920_setup Volver __ret ejecución cabeza-armv.s numeral continúa .__ ret: LDR LR, __switch_da tamcr p15, 0, r0, c1, c0 //Tenga en cuenta que aquí, aquí abrieron MMUmov r0, r0 r0mov, r0mov r0, PC r0mov, lr //salto __mmap_switched, ha habido una barra de direcciones virtuales //esta instrucción LDR LR, __switch_da ta carga __mmap_switched la dirección es la dirección virtual ah __switch_ da ta: .long __mmap_switched ejecutado desde __mmap_switched hasta el fondo, serán transferidos al código de lenguaje C b SYMBOL_NAME (start_kernel) //en el kernel \\ init \\ main.c en este proceso no es particularmente complicada, mira con cuidado busque siendo probablemente puede entender, no puedo conseguirlos aquí, hay un diagrama de flujo de anotación

para el lenguaje C no es difícil entender la lock_kernel (); printk (linux_banner); setup_arch (&command_line); printk (" línea de comandos Kernel:% s \\ n ", saved_command_line); parse_options (command_line); trap_init (); init_IRQ (); sched_init (); softirq_init (); time_init (); es una gran cantidad de inicialización, persiguiendo a cada función optimista
una función rest_init static void (void)

start_kernel última llamada {kernel_thread (init, NULL, CLONE_FS |  CLONE_FILES |  CLONE_SIGNAL); unlock_kernel (); current- > need_resched = 1; cpu_idle ();} kernel_thread estableció con un proceso init, se realiza en lock_kernel función main.c init (); do_basic_setup (); la do_basic_setup llamada do_initcalls función de varios de conducción se realiza en do_initcalls (void) do_initcalls static void __init (void) {* initcall_t llamada;

llamada = &__ initcall_start; do {(* llamada) (); llaman ++;} while (call < &__ initcall_end);

flush_scheduled_tasks ();} __ initcall_start se asigna en los vmlinux.lds, se tendría que encontrar el segmento .initcall.ini kernel \\ include \\ Linux \\ init.h se pueden encontrar en #define __init_call __attribute__ ((no utilizado, __ section__ (" .initcall.init "))) int typedef (* initcall_t) (void); # definir __initcall (fn) \\ estática initcall_t __initcall _ ## fn __init_call fn = bajo un cuidadoso estudio encontraron esta es la dirección de la función de inicialización en el segmento función de inicialización .initcall.init para que pueda continuar a llamar al conductor si no hay una definición de módulo, #define module_init (x) __initcall (x); por lo tanto, Si desea compilar el controlador en el kernel es muy simple y es la última execve si init (execute_command) (execute_command, argv_init, envp_init); execute_command con pase PPCBoot argumentos de línea de comandos son relevantes Oh, es init = /linuxrc por lo que debe linuxrc secuencia de comandos para ejecutar en la raíz de esta secuencia de comandos para realizar busybox busybox y fue a realizar la escritura /etc/init.d/rcS que fue sobre la implementación de /usr/etc/rc.local

Copyright © Conocimiento de Windows All Rights Reserved