도와주세요!!
글 수 15,339
2014.09.12 02:56:35 (*.202.89.130)
13707
안녕하세요.
__mmap_switched 레이블부터 PIC(position-independent code)가 아닌 절대주소(virtual address)로 전환되는 것과 관련하여 궁금한 점이 있습니다.
* 위치 : arch/arm/kernel/head-common.S
1. 위와 같은 경우 한 파일 안에 PIC 와 절대주소 코드가 공존하게 되는데 그 원리가
linker 가 그러한 것이 가능하게끔 GOT (global offset table) 및 관련 코드를 생성해서 그런건가요?
2. 어디서 본 것에 의하면 PIC는 compiler option으로 설정,생성된다고 하는데
head-common.S 의 경우 assembly 이기 때문에 linker 가 그 작업을 해주는건지도 궁금합니다.
3. head.s , head-common.s 에 보면 ADR 명령어가 사용되는데 PIC 방식으로 addressing 하는걸로 알고 있습니다.
결국 compiler option으로 PIC 생성할 경우 이 ADR 명령어가 만들어지는 것인가요? 이것이 linker 가 해주는
PIC 처리와 어떤 연관이 있는지 궁금합니다.
짧은 지식으로 말씀드리면
1. pic 옵션이 사용된 것에서 절대 주소가 사용되는 것은 리눅스 커널 부팅시
mmu 활성화 이전코드들과 달리 활성화 순간에 자신이 이동하여야 할 번지를 미리 알고 있기 때문에
그 주소로 이동하기 위해서 사용될 뿐입니다.
2. 링커 옵션이 아니라 컴파일러에서 어셈블러 코드를 생성할때 적용됩니다.
어셈블러이기 때문에 그 작업을 해주는 것은 아닙니다.
3. adr 명령은 꼭 pic 옵션때문이라기 보다 해당 명령어가 pic 옵션으로 컴파일 될때
필수적으로 필요하기 때문이라고 보시는 것이 맞을거 같습니다.
말씀하신 위치에서 절대 주소가 사용되는 것은 mmu 가 켜지는 순간부터
해당 코드의 주소체계가 달라지기 때문이라고 보시면 됩니다.
mmu 비활성화때에는 모든 아키텍쳐의 물리 메모리가 각각 다르기 때문에 pic 옵션으로 동작하는 것이고
mmu 활성화 되는 순간부터 커널코드는 page_offset 기준의 일관된 가상주소 체계를 사용하기 때문입니다.