.과 : 을 이용한 주소 변환이 계속 나와서 그림을 한번 그려봤습니다.
왼쪽은 컴파일 타임에 정해지는 커널의 가상 주소입니다.
오른쪽은 실제 SDRAM에 올라간 커널의 물리주소 모습입니다.
다음은 왼쪽 빨간색 영역(가상주소)이 오른쪽 파란색 영역(물리주소)으로 주소 변환하는 과정입니다.
커널 이미지 내의 특정 주소를 . (가상주소)으로 나타내면 0xC001_1000 입니다.
같은 주소를 : (물리주소)으로 나타내면 0x3001_1000 입니다.
이 두 주소의 차이를 구합니다.
. (0xC001_1000) - : (0x3001_1000) = 0x9000_0000
_xxx_start 의 가상주소 0xC005_0000 에서 위에서 구한 0x9000_0000을 빼면 물리주소 0x3005_0000이 나옵니다.
_xxx_end 의 가상주소 0xC004_0000 은 물리주소 0x3004_0000이 됩니다.
MMU가 동작하지 않는 구간에서 물리주소를 찾을 수 있도록 이러한 코드를 지속적으로 사용하는것으로 보입니다.
틀린 부분은 지적 부탁드립니다.
댓글 7
-
유경환
2011.10.05 15:41
-
홍문화
2011.10.05 16:30
지난 주는 해설자가 없어서 스포츠 중계가 살짝 매끄럽지 못했습니다.ㅋ
이번 주 중계 다시 기대 하겠습니다. ^^;
-
정현철
2011.10.05 16:12
이건 진짜 점에 대한 거군요. 감사합니다!
-
하상은
2011.10.06 16:08
아.. 전혀 다른이야기 였군요!!
어쩐지 아리송 하더라구요 ^^;
-
홍문화
2011.10.06 16:04
다음과 같은 코드가 여러 곳에서 많이 쓰이더라구요.
이 매커니즘에 대한 설명 이었습니다. ^^;
. => 요녀석 이름이 location counter 였군요. 켘
159 adr r0, __enable_mmu_loc
160 ldmia r0, {r3, r5, r6}
161 sub r0, r0, r3 @ virt->phys offset
162 add r5, r5, r0 @ phys __enable_mmu
163 add r6, r6, r0 @ phys __enable_mmu_end.
.
.
276 __enable_mmu_loc:
277 .long .
278 .long __enable_mmu
279 .long __enable_mmu_end -
하상은
2011.10.06 15:55
음.. 원하시는 바를 제가 잘 파악한건 맞는지 모르겠습니다만..
//vmlinux.lds SECTIONS { #ifdef CONFIG_XIP_KERNEL . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR); #else . = PAGE_OFFSET + TEXT_OFFSET; #endif
XIP 가 아니라 하더라도
. = PAGE_OFFSET + TEXT_OFFSET;
이런식으로 시작부터 location counter 를 옮겨주는 구문이 있습니다
아웃풋 섹션의 시작 주소를 이렇게 핸들링 해줬기 때문이라고 보여지네요.
-
홍문화
2011.10.05 16:40
그런데 라벨 주소를 참조 하면 어떤 원리로 물리주소가 나오게 되는지 잘 이해가 안되네요.
보드를 돌려보면 금방 알텐데...
MMU가 disable 되어 있으니 PC의 값은 물리주소가 될테고 라벨은 여기에 옵셋이 더해진 주소이니
물리주소가 나오는거 같은데 기회 될 때 확실히 테스트를 해봐야겠습니다.
.
오 멋지네요 감사합니다.