Linux启动流程导读(arm为例)(2)

/* Determine validity of the r2 atags pointer.  The heuristic requires
  * that the pointer be aligned, in the first 16k of physical RAM and
  * that the ATAG_CORE marker is first and present.  If CONFIG_OF_FLATTREE
  * is selected, then it will also accept a dtb pointer.  Future revisions
  * of this function may be more lenient with the physical address and
  * may also be able to move the ATAGS block if necessary.
  *
  * Returns:
  *  r2 either valid atags pointer, valid dtb pointer, or zero
  *  r5, r6 corrupted
  */
 __vet_atags:
     tst    r2, #0x3            @ aligned? 不对其就返回
     bne    1f
 
     ldr    r5, [r2, #0]        @读到r5
 #ifdef CONFIG_OF_FLATTREE
     ldr    r6, =OF_DT_MAGIC        @ is it a DTB?  过滤DTB
     cmp    r5, r6
     beq    2f
 #endif
     cmp    r5, #ATAG_CORE_SIZE        @ is first tag ATAG_CORE? must be first
     cmpne    r5, #ATAG_CORE_SIZE_EMPTY
     bne    1f
     ldr    r5, [r2, #4]
     ldr    r6, =ATAG_CORE
     cmp    r5, r6
     bne    1f
 
 2:    mov    pc, lr                @ atag/dtb pointer is ok  
 
 1:    mov    r2, #0
     mov    pc, lr
 ENDPROC(__vet_atags)

============

@#2:__create_page_tables

============

/*
  * Setup the initial page tables.  We only setup the barest
  * amount which are required to get the kernel running, which
  * generally means mapping in the kernel code.
  *
  * r8 = phys_offset, r9 = cpuid, r10 = procinfo
  *
  * Returns:
  *  r0, r3, r5-r7 corrupted
  *  r4 = physical page table address
  */
 __create_page_tables:
     pgtbl    r4, r8                @ page table address

============

[cpp]

1     .ltorg   2     .align   3 __enable_mmu_loc:   4     .long    .   5     .long    __enable_mmu   6     .long    __enable_mmu_end   ==============  


/*
      * Then map boot params address in r2 or
      * the first 1MB of ram if boot params address is not specified.

3.0选择性将enablemmu和boot params双映射,并不是以前机械的前8M双映射

mov     pc,lr

回到

/*
      * The following calls CPU specific code in a position independent
      * manner.  See arch/arm/mm/proc-*.S for details.  r10 = base of
      * xxx_proc_info structure selected by __lookup_processor_type
      * above.  On return, the CPU will be ready for the MMU to be
      * turned on, and r0 will hold the CPU control register value.
 */
     ldr    r13, =__mmap_switched        @ address to jump to after
                         @ mmu has been enabled
     adr    lr, BSYM(1f)            @ return (PIC) address
     mov    r8, r4                @ set TTBR1 to swapper_pg_dir
  ARM(    add    pc, r10, #PROCINFO_INITFUNC    )
  THUMB(    add    r12, r10, #PROCINFO_INITFUNC    )
  THUMB(    mov    pc, r12                )
 1:    b    __enable_mmu

============

进入enable_mmu

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22665.html