- 论坛徽章:
- 1
|
回复 9# darling54454
head_common.S中
__mmap_switched:
adr r3, __mmap_switched_data
ldmia r3!, {r4, r5, r6, r7}
cmp r4, r5 @ Copy data segment if needed
1: cmpne r5, r6
ldrne fp, [r4], #4
strne fp, [r5], #4
bne 1b
mov fp, #0 @ Clear BSS (and zero fp)
1: cmp r6, r7
strcc fp, [r6],#4
bcc 1b
ARM( ldmia r3, {r4, r5, r6, r7, sp}) 栈顶就是全局结构体init_thread_union,你可以看到只有部分有初值,cpu字段编译时自动填为0了,你可以反汇编vmlinux就能确认cpu字段的初值(从System.map里找到init_thread_union的地址,然后再在vmlinux的反汇编里去查看)
THUMB( ldmia r3, {r4, r5, r6, r7} )
THUMB( ldr sp, [r3, #16] )
str r9, [r4] @ Save processor ID
str r1, [r5] @ Save machine type
str r2, [r6] @ Save atags pointer
cmp r7, #0
bicne r4, r0, #CR_A @ Clear 'A' bit
stmneia r7, {r0, r4} @ Save control register values
b start_kernel
所以在start_kernel之前,thread_info.cpu就已经为0了,所以在boot_cpu_init处cpu id为0
|
|