内核在没有开启MMU之前,内核堆栈的设置在arch/arm/boot/compressed/head.S中。
代码片段:
restart: adr r0, LC0 /* 获取标号LC0的地址 */
ldmia r0, {r1, r2, r3, r6, r10, r11, r12} /* 读取LC0地址处的内容到寄存器列表中的寄存器中 */
ldr sp, [r0, #28] /* 偏移28即跳过上面7个32位的偏移,把.L_user_stack_end标号地址加载到sp中,即设定堆栈, */
.align 2
.type LC0, #object
LC0: .word LC0 @ r1
.word __bss_start @ r2
.word _end @ r3
.word _edata @ r6
.word input_data_end - 4 @ r10 (inflated size location)
.word _got_start @ r11
.word _got_end @ ip
.word .L_user_stack_end @ sp /* 会 */
.size LC0, . - LC0
.......
.align
.section ".stack", "aw", %nobits
.L_user_stack: .space 4096
.L_user_stack_end:
从这里看到启动的时候使用的堆栈大小为4KB,起始地址在.L_us