30
Linux Kernel 코코코코 (Ver 3.12.20) arch/arm/boot/compressed/head.S restart

커널코드분석 20140621(head.s restart)

Embed Size (px)

DESCRIPTION

arch/arm/boot/compressed/head.S 의 restart label 부분 분석

Citation preview

Page 1: 커널코드분석 20140621(head.s restart)

Linux Kernel 코드분석(Ver 3.12.20)

arch/arm/boot/compressed/head.Srestart

Page 2: 커널코드분석 20140621(head.s restart)
Page 3: 커널코드분석 20140621(head.s restart)

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 에 로드

Page 4: 커널코드분석 20140621(head.s restart)

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

Page 5: 커널코드분석 20140621(head.s restart)

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

Page 6: 커널코드분석 20140621(head.s restart)

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

Page 7: 커널코드분석 20140621(head.s restart)

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

Page 8: 커널코드분석 20140621(head.s restart)

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

Page 9: 커널코드분석 20140621(head.s restart)

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

Page 10: 커널코드분석 20140621(head.s restart)

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

Page 11: 커널코드분석 20140621(head.s restart)

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

Page 12: 커널코드분석 20140621(head.s restart)

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

Page 13: 커널코드분석 20140621(head.s restart)

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

Page 14: 커널코드분석 20140621(head.s restart)

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

Page 15: 커널코드분석 20140621(head.s restart)

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

Page 16: 커널코드분석 20140621(head.s restart)

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

Page 17: 커널코드분석 20140621(head.s restart)

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

Page 18: 커널코드분석 20140621(head.s restart)

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 위치를 원래 위치로 .

Page 19: 커널코드분석 20140621(head.s restart)

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

Page 20: 커널코드분석 20140621(head.s restart)

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

Page 21: 커널코드분석 20140621(head.s restart)

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

Page 22: 커널코드분석 20140621(head.s restart)

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

Page 23: 커널코드분석 20140621(head.s restart)

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 까지 고려해야 하기 때문 ?

Page 24: 커널코드분석 20140621(head.s restart)

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

Page 25: 커널코드분석 20140621(head.s restart)

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

Page 26: 커널코드분석 20140621(head.s restart)

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

Page 27: 커널코드분석 20140621(head.s restart)

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

Page 28: 커널코드분석 20140621(head.s restart)

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

Page 29: 커널코드분석 20140621(head.s restart)

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

Page 30: 커널코드분석 20140621(head.s restart)

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