word
word
1 / 14
word
Linux核构成
(国嵌)
1.解压缩
2.初始化
3.启动应用程序
word
word
2 / 14
word
Linux核启动流程
作
not_relocated: mov r0, #0
1: str r0, [r2], #4 clear bss
str r0, [r2], #4
str r0, [r2], #4
str r0, [r2], #4
cmp r2, r3
blo 1b
然后224行,打开cache,并为后面解压缩设置64KB的临时malloc空间
bl cache_on
mov r1, sp malloc space above stack
add r2, sp, #0x10000 64k max 接下来238行进行检查,确定核解压缩后的Image目标地址是否会覆盖到zImage头,如果是则准备将zImage头转移到解压出来的核后面
cmp r4, r2
bhs wont_overwrite
sub r3, sp, r5 > pressed kernel size
add r0, r4, r3, lsl #2 allow for 4x expansion
cmp r0, r5
bls wont_overwrite
mov r5, r2 depress after malloc space
mov r0, r5
word
word
4 / 14
word
mov r3, r7
bl depress_kernel
真实情况——在大多数的应用中,核编译都会把压缩的zImage和非压缩的Image到同样的地址,s3c2410平台下即是0x30008000。这样做的好处是,人们不用关心核是Image还是zImage,放到这个位置执行就OK,所以在解压缩后zImage头必须为真正的核让路。
在250行解压完毕,核长度返回值存放在r0寄存器里。在核末尾空出128字节的栈空间用,并且使其长度128字节对齐。
add r0, r0, #127 + 128 alignment + stack
bic r0, r0, #127 align the kernel length
算出搬移代码的参数:计算核末尾地址并存放于r1寄存器,需要搬移代码原来地址放在r2,需要搬移的长度放在r3。然后执行搬移,并设置好sp指针指向新的栈(原来的栈也会被核覆盖掉)
add r1, r5, r0 end of depressed kernel
adr r2, reloc_start
ldr r3, LC1
add r3, r2, r3
1: ldmia r2!, {r9 - r14} copy relocation code
stmia r1!, {r9 - r14}
ldmia r2!, {r9 - r14}
stmia r1!, {r9 - r14}
cmp r2, r3
blo 1b
add sp, r1, #128 r
嵌入式Linux2.6内核启动流程) 来自淘豆网m.daumloan.com转载请标明出处.