Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

primary_switch에서 primary_switched로 브랜치 할때 질문입니다.

작성자
belldum
작성일
2023-09-10 13:44
조회
84
안녕하세요 문영일님.
head.S의 primary_switch에서 primary_switched로 브랜치되는 부분에서 궁금한게 생겨 질문드립니다. (6.4.0v)

head.S 뒷부분에서
init_pg_dir 셋팅이 끝나고 primary_switched로 branch할때 0xffff~로 시작하는 가상주소가 사용된다고 이해했습니다.
http://jake.dothome.co.kr/head-64-60/ "primary_switch에서 primary_switched로 전환" 부분에서 실제 주소를 써주셨는데

primary_switch:
0x0000000040f78310: adrp x1, 0x41fbb000
0x0000000040f78314: bl 0x40f78248 ; enable_mmu
0x0000000040f78318: bl 0x40f782c8 ; relocate_kernel
0x0000000040f7831c: ldr x8, 0x40f78338 ; =primary_switched
0x0000000040f78320: adrp x0, 0x40200000 ; PHYS_OFFSET
0x0000000040f78324: br x8
...
0x0000000040f78338: .inst 0x114b0330
0x0000000040f78338: .inst 0xffff8000

primary_switched:
0xffff8000114b0330 <+0>: adrp x4, 0xffff800011a70000
0xffff8000114b0334 <+4>: add sp, x4, #0x4, lsl #12
0xffff8000114b0338 <+8>: adrp x5, 0xffff800011a83000
0xffff8000114b033c <+12>: add x5, x5, #0x300
....

0x0000000040f7831c: ldr x8, 0x40f78338 ; =primary_switched 여기 부분이 head.S에서는 "ldr x8, =primary_switched" 이렇게 되어 있는데
https://damduc.tistory.com/336 요런 자료들(literal pool)을 참고해보니 0x40f78338에 있는 값인 0xffff8000_114b0300이 x8에 저장되는 것으로 해석했습니다.
그 다음 br x8이 실행되면서 0xffff8000_114b0300주소 + init_pg_dir 테이블 + MMU가 작동되어 가상메모리 시스템을 사용한다까지 이해하였습니다.


그런데 0x40f78338 이 주소에 0xffff8000_114b0300 이 값이 저장되어 있다는 것은
빌드타임에 어셈블러가 "ldr x8, =primary_switched"를 보고 primary_switch 심볼 주소 + offset 위치에 primary_switched 심볼 주소를 저장하는 동작을 하는게 맞을까요??
전체 1
  • 2023-09-11 12:55
    안녕하세요? belidum님,

    네. 정확히 맞습니다.

    빌드 타임에 ldr x8, =primary_switched 명령을 만나면, 어셈블러가 primary_switched의 가상 주소를 ldr 명령에서 가까운 임시 저장 장소(0x40f78338)에 8바이트에 담아둡니다. 이렇게 담아두는 이유는 ldr 명령이 가까운 상대 위치에서 값을 읽어올 수 있기 때문입니다.

    참고: https://github.com/iamroot20/linux-stable/blob/main-study/arch/arm64/kernel/head.S - iamroot 20기 분석 내용입니다.

    감사합니다.

    문영일 드림.