http://gicl.cs.drexel.edu/people/sevy/linux/ARM_Linux_boot_sequence.html


ARM Linux Boot Sequence
The following traces the Linux boot sequence for ARM-based systems in
the 2.6.18 kernel. It looks at just the earliest stages of the boot
process, until the generic non-processor-specific start_kernel function
is called. The line numbers of each statement are in parenthese at the
end of the line; the kernel source itself can be conveniently browsed on
the Linux Cross-Reference website.


zImage decompression
      * arch/arm/boot/compressed/head.S: start (108)
              * First code executed, jumped to by the bootloader, at
                label "start" (108)
              * save contents of registers r1 and r2 in r7 and r8 to
                save off architecture ID and atags pointer passed in by
                bootloader (118)
              * execute arch-specific code (inserted at 146)
                      * arch/arm/boot/compressed/head-xscale.S or other
                        arch-specific code file
                      * added to build in
                        arch/arm/boot/compressed/Makefile
                      * linked into head.S by linker section
                        declaration:  .section "start"
                      * flush cache, turn off cache and MMU
              * load registers with stored parameters (152)
                      * sp = stack pointer for decompression code (152)
                      * r4 = zreladdr = kernel entry point physical
                        address
              * check if running at link address, and fix up global
                offset table if not (196)
              * zero decompression bss (205)
              * call cache_on to turn on cache (218)
                      * defined at arch/arm/boot/compressed/head.S (320)
                      * call call_cache_fn to turn on cache as
                        appropriate for processor variant
                              * defined at
                                arch/arm/boot/compressed/head.S (505)
                              * walk through proc_types list (530) until
                                find corresponding processor
                              * call cache-on function in list item
                                corresponding to processor (511)
                                      * for ARMv5tej core, cache_on
                                        function is __armv4_mmu_cache_on
                                        (417)
                                              * call setup_mmu to set up
                                                initial page tables
                                                since MMU must be on for
                                                cache to be on (419)
                                              * turn on cache and MMU
                                                (426)
              * check to make sure won't overwrite image during
                decompression; assume not for this trace (232)
              * call decompress_kernel to decompress kernel to RAM (277)
              * branch to call_kernel (278)
                      * call cache_clean_flush to flush cache contents
                        to RAM (484)
                      * call cache_off to turn cache off as expected by
                        kernel initialization routines (485)
                      * jump to start of kernel in RAM (489)
                              * jump to address in r4 = zreladdr from
                                previous load
                                      * zreladdr = ZRELADDR = zreladdr-y
                                      * zreladdr-y specified in
                                        arch/arm/mach-vx115/Makefile.boot


ARM-specific kernel code
      * arch/arm/kernel/head.S: stext (72)
              * call __lookup_processor_type (76)
                      * defined in arch/arm/kernel/head-common.S (146)
                      * search list of supported processor types
                        __proc_info_begin (176)
                              * kernel may be built to support more than
                                one processor type
                              * list of proc_info_list structs
                                      * defined in
                                        arch/arm/mm/proc-arm926.S (467)
                                        and other corresponding proc-*.S
                                        files
                                      * linked into list by section
                                        declaration:  .section
                                        ".proc.info.init"
                      * return pointer to proc_info_list struct
                        corresponding to processor if found, or loop in
                        error if not
              * call __lookup_machine_type (79)
                      * defined in arch/arm/kernel/head-common.S (194)
                      * search list of supported machines (boards)
                              * kernel may be built to support more than
                                one board
                              * list of machine_desc structs
                                      * machine_desc struct for boards
                                        defined in board-specific file
                                        vx115_vep.c
                                      * linked into list by section
                                        declaration that's part of
                                        MACHINE_DESC macro
                      * return pointer to machine_desc struct
                        corresponding to machine (board)
              * call __create_page_tables to set up initial MMU tables
                (82)
              * set lr to __enable_mmu, r13 to address of __switch_data
                (91, 93)
                      * lr and r13 used for jumps after the following
                        calls
                      * __switch_data defined in
                        arch/arm/kernel/head-common.S (15)
              * call the __cpu_flush function pointer in the previously
                returned proc_info_list struct (94)
                      * offset is #PROCINFO_INITFUNC into struct
                      * this function is __arm926_setup for the ARM
                        926EJ-S, defined in arch/arm/mm/proc-arm926.S
                        (392)
                              * initialize caches, writebuffer
                              * jump to lr, previously set to address of
                                __enable_mmu
              * __enable_mmu (147)
                      * set page table pointer (TTB) in MMU hardware so
                        it knows where to start page-table walks (167)
                      * enable MMU so running with virtual addresses
                        (185)
                      * jump to r13, previously set to address of
                        __switch_data, whose first field is address of
                        __mmap_switched
                              * __switch_data defined in
                                arch/arm/kernel/head-common.S (15)

      * arch/arm/kernel/head-common.S: __mmap_switched (35)
              * copy data segment to RAM (39)
              * zero BSS (45)
              * branch to start_kernel (55)


Processor-independent kernel code
      * init/main.c: start_kernel (456)




-- 
Regards,
Peter Teoh

Reply via email to