booting 초기 addressing 에 대해.
안녕하세요.
ARM Linux porting을 해보려고 booting sequence를 공부하고 있는데 이게 너무 궁금하네요.
고수님들의 관심과 도움 부탁드립니다.
1. bootloader가 compressed kernel 이미지인 zImage를 RAM에 loading 할 때 이 load address(0x20000000)와 zImage의 entry point 주소값(0x0)이
다른 경우 zImage의 symbol들의 주소가 load address에 맞춰 변경이 되나요?
2. zImage는 position-independent code 라고 하는데 위와 같은 걸 말하는건가요? (loading 되면서 symbol 주소들이 재계산되는것)
3. 맞다면, position-independence는 이미지 컴파일 할 때 옵션 -fpic 를 줘서 만들어지는걸로 알고 있는데 이때 컴파일러가 위와 같은 작업을 해주는
어떤 코드를 이미지에 insert 해주는건가요? 아니면 postion-independent code는 어디에서 어떤 원리로 동작하는건가요?
4. 비슷한 맥락인데 linux-2.6.30.4 버젼의 compressed/head.S 에 있는 아래 부분에서의 delta 값이 zero가 아니게 되는 경우가 언제인가요?
2.6.30.4 버젼에서는 이 부분이 zImage에서 처음 실행되는 부분입니다. 고로, 사전에 이미지 재배치 같은 게 일어나지 않았을건데
이때 LC0 심볼의 address가 달라질 가능성이 있나요? (이 코드에 대해 많은 분들이 아시리라 생각이 됩니다.)
.text
adr r0,LC0
ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp}
subs r0, r0, r1 @calculate the delta offset
beq not_relocated @ if delta is zero, we are running at the address we were lined at.
댓글 달기