(3) linux_prep
向kernel传递正确的参数,引导linux kernel。设置好标记列表后就要调用内核了。但调用内核前,CPU寄存器的设置必须满足下面的条件:
Ø r0=0
Ø r1=机器码
Ø r2=内核参数标记列表在RAM中的起始地址
imx-bootlets-src/linux_prep/core/entry.S 承载着这一使命。
_start:
stmdbsp!, {r4-r12, lr}
/* Check entry counter */
ldrr4, entry_count
cmpr4, #0
bnestart_kernel
//如果从休眠启动内核,entry_count > 0跳到try_to_resume;
//否则entry_count = 0;直接start_kernel
bltry_to_resume
/* Update counter to show we were here */
addr4, r4, #1
strr4, entry_count
//增加entry_count,用以标示内核从什么状态启动。
/* Return to ROM */
ldmiasp!, {r4-r12, lr}
bxlr
//在来看看start_kernel 做了哪些工作呢?
start_kernel:
blclear_bss
//首选清除BBS段,如果不清除,以后程序会出现执行错误
/* Initialize HW modules relevant for linux_prep */
blhw_init
/* Setup tags for Linux kernel and save tags pointer in r2 */
blsetup_tags
movr2, r0
//R2里面保持了内核启动参数的地址, r0里面存储的是setup_tags()的返回值。
//即内核启动参数的地址
//setup_tags()函数式用C语言编写,设置启动内核的参数
/* Store machine id in r1 */
ldrr1, =MACHINE_ID
//R1保持了MX28_EVK的ID
//其实就是个数字 #define MACHINE_ID2531
/* Zero r0 register */
movr0, #0
//当然要清除R0了,这个启动内核前的需求。
/* Jump to Linux kernel */
ldrlr, =KERNEL_BASE_ADDRESS
movpc, lr
//跳到内核代码处,将执行内核代码的自解压程序
//如果从休眠状态启动内核,就跳到 try_to_resume .
|