Linux内核启动流程分析(二).doc:..(第二阶段)接着上面的分析,第一阶段的代码跳转后,会进入笫二阶段的代码。第二阶段的代码是从\arch\arm\kerne1\。内核启动第二阶段主要完成的工作有,cpuID检查,machineID(也就是开发板ID)检查,创建初始化页表,设置C代码运行环境,跳转到内核第一个真正的C函数startkernel开始执行。这一阶段涉及到两个重要的结构体:(1)一个是structproc_info_list主要描述CPU相关的信息,定义在文件arch\arm\include\asm\,与其相关的函数及变量在文件arch/arm/mm/。(2)另一个结构体是描述开发板或者说机器信息的结构体structmachine_desc,定义在\arch\arm\include\asm\mach\,其函数的定义和变量的赋值在板极相关文件arch/arm/mach-s3c2410/mach~,这也是内核移植非常重要的一个文件。该阶段一般由前面的解压缩代码调用,进入该阶段要求:MMU=off,D-cache=off,I-cache=dontcare,rO=0,rl=-types文件中,在编译时会将这些机器ID按照统一的格式链接到基本内核映像文件vmlinux的_arch_info_begin和_arch_info_end之间的段中。存储格式定义在include/asm-arm/mach/arch,h文件中的结构体structmachine_desc{}。这两个结构体的内容最终会被连接到基本内核映像vmlinux中的两个段内,分别是*(.,init)和*(.,init),可以参考下面的连接脚本。链接脚本:arch/arm/kernel/•I•qfflA^llyI *7*SECTIONS・-TEXTADDR;・init:{/♦初始化代码段*/_stext=・;_sinittext=・:*(.)_einittext=・;_proc_info_begin=・;*(.,init)jwoc—inro’nd=・;=・;*{.arch・info・init)__arch_info_end=・;tagtable_begi!i=・:♦(.taglist,init)__tagtable_end=・:・=ALIGN<16);__setup_start=・;*(.)__setup_end=・;__early_begin=・;*(・earl>\param・init)__early_end=・;__initcall_start=・;*(.)*(.)*(.)*(.)*(.)*(.)*(.)__initcall_end二・;__con_initeall_start=・;*(.)_con_initeall_end二・;_security」ni=・:*(.security_initrail,init)_security_initeall_ond=・;・=ALIGN(32);__initramfs_start=・;usr/built-in・o(・init・__initramfs_en(i=・;・=ALIGN(64):__P^r_cpu_start=・;*{・data・perepu)__P<?r_cpu_end=・:=_stext;*(.)・=ALIGN(1096);init_end=・:#en<iif*****************************链接脚本**************************************F面开始代码\arch\arm\kerne1\:开始分析前先看下•,zImage,bin压缩镜像是由bootloader加载到物理内存,然后跳到zlmage.
Linux内核启动流程分析(二) 来自淘豆网m.daumloan.com转载请标明出处.