Download - 커널코드분석 20140621(head.s restart)
Linux Kernel 코드분석(Ver 3.12.20)
arch/arm/boot/compressed/head.Srestart
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, l 니 #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0r1
r2
r3
r10r11
r12
sp
r6
LC0 label 에 기록된 각 word 값을 register 에 로드
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 @ delta offset add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r1
r2
r3
r10r11
r12
sp
r6
r0=r1 이면 변화없음
r0 = 0
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r2
r3
r10r11
r12
sp
r6
r10 에서 decompressed image size 읽음 .
r9Read size
r0 = 0
r1
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
Malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r2
r3
r10
r11
r12
sp
r6
Delta offset = 0 이면 sp 는 변화없음 .r10 위치 이동 .
R9 : decompress image size
r0 = 0
r1
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
Malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r2
r3
r10
r11
r12
sp
r6
r5 = 0lr = *(int *)r6r1 = dtb sig
R9 : decompress image size
lr = sig
r0 = 0
r1
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r2
r3
r10
r11
r12
sp
r6
zImage 바로 다음 4 byte 가 r1(sig) 값과 다르면 dtb_check_done 으로 분기 .같으면 dtb 가 append 된 것이므로 아래로 진행 .
R9 : decompress image size
lr = sig
r0 = 0
r1
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r2
r3
r10
r11
r12
sp
r6
sp 를 malloc 끝으로 이동하고 , r0-r3, ip, lr 을 백업
R9 : decompress image size
lr = sig
r0 = 0
r1
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = atags pointer
r1 r2
r3
r10
r11
r12
sp
r6
r0 = atags pointerr1 = dtb start
R9 : decompress image size
lr = sig
restart: adr r0, LC0 ldmia r0, {r1, r2, r3, r6, r10, r11, r12} ldr sp, [r0, #28] sub r0, r0, r1 add r6, r6, r0 add r10, r10, r0 ldrb r9, [r10, #0] … orr r9, r9, r10, lsl #24
#ifndef CONFIG_ZBOOT_ROM add sp, sp, r0 add r10, sp, #0x10000#else mov r10, r6#endif
mov r5, #0#ifdef CONFIG_ARM_APPENDED_DTB ldr lr, [r6, #0]#ifndef __ARMEB__ ldr r1, =0xedfe0dd0#else ldr r1, =0xd00dfeed#endif
cmp lr, r1 bne dtb_check_done
#ifdef CONFIG_ARM_ATAG_DTB_COMPAT add sp, sp, #0x10000 stmfd sp!, {r0-r3, ip, lr} mov r0, r8 mov r1, r6 sub r2, sp, r6
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = atags pointer
r1
r2 = DTB
r3
r10
r11
r12
sp
r6
r2 = bss start ~ sp = dtb
R9 : decompress image size
lr = sig
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = atags pointer
r1
r3
r10
r11
r12
sp
r6
R9 : decompress image size
r2 = DTB
r0, r1, r2 를 인자로 atags_to_fdt 호출
sig
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = atags_to_fdt 리턴값
r1
r3
r10
r11
r12
sp
r6
R9 : decompress image size
r2 = DTB
리턴값이 1 인지 검사
sig
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = RAM start + 1
r1
r3
r10
r11
r12
sp
r6
R9 : decompress image size
r2 = DTB
r4 = decomp image start + 1
sig
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = RAM start
r1
r3
r10
r11
r12
sp
r6
R9 : decompress image size
r2 = DTB
r4 = decomp image start + 1
r0 – 1 을 하여 RAM start 를 가리킴
sig
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = RAM start + 0x100
r1
r3
r10
r11
r12
sp
r6
R9 : decompress image size
r2 = DTB
r4 = decomp image start + 1
0x100 에서 atags list 다시 read 시도
sig
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r0 = RAM start + 0x100
r1
r3
r10
r11
r12
sp
r6
R9 : decompress image size
r2 = DTB
r4 = decomp image start + 1
위에서 리턴값이 1 이었다면 변경된 r0, r1, r2 로 atags_to_fdt 재시도
sig
r2
r3
sp
lr = sig
r0 = 0
r1
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
r6
R9 : decompress image sizer4 = decomp image start + 1
백업해둔 register 복원하고sp 위치를 원래 위치로 .
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
_kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
이제부터 r8 는 atags pointer 가 아니라 DTB start 를 가리킴 .
r8 r2lr = sig
r0 = 0
r1
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
r5 = _kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r5 = kernel_bss_size = 압축풀린 vmliux 의 bss size(root directory 의 vmlinux) readelf –S 로 확인 가능
r8 r2lr = sig
r0 = 0
r1
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
r5 = _kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
r1 = wont_overwrite
r2lr = sig
r0 = 0
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
r5 = _kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
r1
r2lr = sig
r0 = 0
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
r5 = _kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
r1 (1)
이 계산을 왜 할까 ?아직 정확히 모르겠음 .
r1 = (2) – (1)
(2)
lr = sig
r0 = 0
r2
뒤쪽에서 재배치할 때 새로운 재배치 위치를 decompressed image 위로 잡는데 그 때 kernel bss 까지 고려해야 하기 때문 ?
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
r5 = _kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
r5 > r1 일 때 수행 .재배치 시에 kernel bss 자리에 재배치 코드가 Overlap 되지 않도록 ?
r1 (1)
r9 = r9 + {(2) – (1)}
(2)
lr = sig
r0 = 0
r2
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
DTB start + 4 위치에는 dtb size 가 기록되어 있음 .
r1 (1)
r9 = r9 – {(2) – (1)}
(2)
dtb size
r5 = dtb size
lr = sig
r0 = 0
r2
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
dtb size 를 endian 에 맞게 읽어들임 .
(1)
r9 = r9 – {(2) – (1)}
(2)
dtb size
r5 = dtb size
lr = sig
r0 = 0
r1 = temp
r2
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
sp
r6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
dtb size 값을 8 byte align 값으로 맞춤 .
(1)
r9 = r9 – {(2) – (1)}
(2)
dtb size
r5 = dtb size
lr = sig
r0 = 0
r1 = temp
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
spr6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
r6 를 실제 dtb end 를 가리키도록 함 .
(1)
r9 = r9 – {(2) – (1)}
(2)
dtb size
r5 = dtb size
lr = sig
r0 = 0
r1 = temp
r2
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
spr6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
dtb 가 있는 경우를 고려하면 그만큼 더해야지
(1)
r9 = r9 – {(2) – (1)}
(2)
dtb size
r5 = dtb size
r10
+= dtb size
lr = sig
r0 = 0
r1 = temp
r2
bl atags_to_fdt cmp r0, #1 sub r0, r4, #TEXT_OFFSET bic r0, r0, #1 add r0, r0, #0x100 mov r1, r6 sub r2, sp, r6 bleq atags_to_fdt ldmfd sp!, {r0-r3, ip, lr} sub sp, sp, #0x10000#endif
mov r8, r6 ldr r5, =_kernel_bss_size adr r1, wont_overwrite sub r1, r6, r1 subs r1, r5, r1 addhi r9, r9, r1 ldr r5, [r6, #4]
#ifndef __ARMEB__ eor r1, r5, r5, ror #16 …#endif
add r5, r5, #7 bic r5, r5, #7 add r6, r6, r5 add r10, r10, r5 add sp, sp, r5
malloc (64 k)
stack
bss
zImage
kernel_bss_size
Decompressed Image
Page Table
L_user_stack_end
LC0
__bss_start = _edata
_end
_input_data_end - 4_got_start
_got_end
r3
r10
r11
r12
spr6
R9 : decompress image sizer4 = decomp image start + 1
r8
wont_overwrite
dtb 가 있는 경우를 고려하면 그만큼 더해야지
(1)
r9 = r9 – {(2) – (1)}
(2)
dtb size
r5 = dtb size
+= dtb sizesp
lr = sig
r0 = 0
r1 = temp
r2