一、BootLoader引导内核过程
    1、Bootloader的工作
    1.1、将内核读入内存
    1.2、保存内核启动参数到指定位置,内核启动时去这个位置解析参数
    1.3、启动内核、传入机器ID
二、内核的启动流程
        内核首要目的是挂载根文件系统,启动应用程序,内核启动的过程大致为以下几步:
1.检查CPU和机器类型
2.进行堆栈、MMU等其他程序运行关键的东西进行初始化
3.打印内核信息
4.执行各种模块的初始化
5.挂接根文件系统
6.启动第一个init进程
对于ARM的处理器,内核第一个启动的文件是arc/arm/kernel下面的head.S文件
第一阶段:
首先截取部分head.S文件
ENTRY(stext)

 THUMB(    adr    r9, BSYM(1f)    )    @ Kernel is always entered in ARM.
 THUMB(    bx    r9        )    @ If this is a Thumb-2 kernel,
 THUMB(    .thumb            )    @ switch to Thumb now.
 THUMB(1:            )

    setmode    PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
                        @ and irqs disabled
    mrc    p15, 0, r9, c0, c0        @ get processor id
    bl    __lookup_processor_type        @ r5=procinfo r9=cpuid
    movs    r10, r5                @ invalid processor (r5=0)?
 THUMB( it    eq )        @ force fixup-able long branch encoding
    beq    __error_p            @ yes, error 'p'

#ifdef CONFIG_ARM_LPAE
    mrc    p15, 0, r3, c0, c1, 4        @ read ID_MMFR0
    and    r3, r3, #0xf            @ extract VMSA support
    cmp    r3, #5                @ long-descriptor translation table format?
 THUMB( it    lo )                @ force fixup-able long branch encoding
    blo    __error_p            @ only classic page table format
#endif
View Code
第一步,执行的是__lookup_processor_type,这个函数是检查处理器型号,它读取你的板子的CPU型号与内核支持的处理器进行比较看是否能够处理。
第二步,检查机器型号,它会读取你bootloader传进来的机器ID和他能够处 理的机器ID进行比较看是否能够处理。内核的ID号定义在arc/arm/tool/mach_types文件中MACH_TYPE_xxxx宏定义。内 核究竟就如何检查是否是它支持的机器的呢?实际上每个机器都会在/arc/arm/mach-xxxx/smdk-xxxx.c文件中有个描述特定机器的 数据结构,
MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks <ben-linux@fluff.org> */
    .atag_offset    = 0x100,

    .init_irq    = s3c24xx_init_irq,
    .map_io        = smdk2440_map_io,
    .init_machine    = smdk2440_machine_init,
    .timer        = &s3c24xx_timer,
    .restart    = s3c244x_restart,
MACHINE_END
View Code

MACHINE_START和 MACHINE_END实际上被展开成一个结构体

#defineMACHINE_START(_type,_name)                 \  
staticconst struct machine_desc __mach_desc_##_type       \  
 __used                                             \  
 __attribute__((__section__(".arch.info.init")))= {    \  
       .nr          =MACH_TYPE_##_type,           \  
       .name             =_name,  
        
#defineMACHINE_END                          \  
};  
View Code

相关文章: