Q&A 게시판

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

vmlinux.lds.S의 AT directives에 관하여 질문이 있습니다.

작성자
fincrusia
작성일
2019-08-04 22:59
조회
422
안녕하세요? 언제나 도움을 받고 있는 커널 뉴비입니다.

다름이 아니라 현재 /arch/(arch)/kernel/vmlinux.lds.S를 분석 중인데요,

ARM64의 경우 LMA를 따로 지정하지 않고 location counter(".")만 옮겨다니며 VMA만 할당합니다.
반면에 x86 링커 스크립트의 경우 각 섹션마다 일일히 AT(...) directives를 사용하여 LMA를 지정하고 있습니다.

왜 이런 차이가 나는 걸까요?

일단 제가 추측하기로는, x86 버전에서 AT directives를 써서 LMA를 지정해주는게 원래 맞는데, KASLR이 도입되며 kernel image가 relocatable해져서 그냥 중요해지지 않은게 아닐까 싶습니다. ARM64는 그 이후에 나온거라 LMA 지정을 하지 않았고요.

이런 추측이 과연 맞을까요?

만약 맞다면, bootloader은 system map에서 각 sections의 VMA만 보고 일정 offset을 자기 마음대로 빼서 physically allocate한다고 봐도 될까요?

궁금합니다.
전체 2
  • 2019-08-08 16:33
    안녕하세요?

    각 섹션의 가상 주소(VMA)는 KASLR 옵션을 사용 우무와 상관없이 컴파일 타임에 미리 지정됩니다.

    저도 arm64 코드를 보니 .head.text 및 .text는 AT 명령을 사용하여 주소를 지정하지 않았더군요.
    그 외에 .init.text, .data, .rodata 및 .bss 등의 다른 섹션들은 주소를 지정하였습니다.

    .head.text.와 .text에서 왜 지정하지 않았는지는 저도 구분되지 않습니다.

    참고로 아래 링크에는 Linker Script File에 대해 쉽게 설명하여 첨부합니다.
    http://www.bravegnu.org/gnu-eprog/lds.html

    그리고, 커널 이미지를 읽은 후 동작시키는 위치는 부트 로더마다 다 다릅니다.
    디버그 정보를 제거하고 운영하는 경우가 많기 때문에 섹션 정보 없이 구동시킵니다.

    즐거운 하루 되세요.

    • 2019-08-08 17:40
      감사합니다!