Chapter 3. 141p 그림 3-14 문의드립니다.

78 views
Skip to first unread message

Yun Levi

unread,
Jul 2, 2018, 10:47:58 AM7/2/18
to linux-ke...@googlegroups.com
 먼저 이번에 좋은 책을 내 주신 저자분들께 감사드립니다.

안녕하세요. 이번에 책을 구입해 다시 한 번 리눅스 4.6을 분석해 보고 있는 독자입니다.

책을 읽다가 몇가지 문의 사항이 있어 이렇게 메일을 작성해 봅니다.

       • 그림 3-14에서 커널 이미지 부분의 매핑이 __map_memblock 함수로,  PAGE_OFFSET 아래 부분에 매핑한 것 처럼 보이나, kimage로 표시된 부분은 앞서 설명된 map_kernel_chunk로 이루어지고, 
__map_memblock의 kimage의 해당 영역은 PAGE_OFFSET위에 속성만 다르게 매핑 되는 게 아닌가요? __phy_to_virt 매크로는 항상 PAGE_OFFSET위 주소를 리턴해 문의 드립니다.
  
       • 실제 커널이 부트로더에 의해서 로딩될 때 물리주소 어디에 로딩이 되는 건가요? _text 값이 어떻게 되는디 궁금합니니다.

       • __pa에서 사용되는 kimage_voffset은 어떻게 설정이 되는 건가요? 
  
확인 부탁드립니다.
감사합니다.

P.S 
 군복무중이라 코드를 전체적으로 벌 여건과 검색에 상 당히 제한이 있어....; 코드에서 검색하기 어려워 너무 쉽 게 얻을 수 있는 질문을 해 죄송합니다..;


jakei...@gmail.com

unread,
Jul 3, 2018, 10:20:16 AM7/3/18
to Linux Kernel ARM
안녕하세요? 저자 문영일 입니다.

질문에 곧바로 답변을 드리기에 앞서 조금 넓게 설명을 하겠습니다.

예를 들어 48비트의 가상 주소 공간을 사용하는 커널을 빌드하였다고 가정합니다. (VA_BITS=48, 4K Page 기준)

다음은 빌드된 vmlinux의 섹션 부분의 일부입니다. 커널의 가상 공간 시작 주소를 특별히 변경하지 않으면 0xffff000008080000에서 시작됨을 알 수 있습니다.

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .head.text PROGBITS ffff000008080000 00010000
0000000000001000 0000000000000000 AX 0 0 4096
[ 2] .text PROGBITS ffff000008081000 00011000
000000000097ab30 0000000000000000 AX 0 0 2048
[ 3] .rodata PROGBITS ffff000008a00000 00990000
00000000004091a8 0000000000000000 WA 0 0 4096
[ 4] .eh_frame PROGBITS ffff000008e091a8 00d991a8


그리고 DRAM 물리 주소는 0x40000000부터 시작된다고 가정하고 데이터를 다음과 같이 준비하였습니다.

0x40000000 DRAM 시작 물리 주소
0x40080000 pa_start(커널 코드 물리 주소 시작)

DRAM은 시스템이 부팅될 때 해당 시스템에 의해 결정되지만 _text, _etext 주소는 다음과 같이 컴파일
타임에 결정됩니다.

0xffff000008080000 va_start = _text(커널 코드 가상 주소 시작)
0xffff000008a00000 va_end = _etext(커널 코드 끝)
0x00980000 size(커널 코드 사이즈)

커널 랜더마이즈를 사용하지 않는 경우 아래 값은 다음과 같습니다.
kimage_voffset = 0xfffeffffc8000000

va_start - kimage_voffset = pa_start

결론을 내보겠습니다.

DRAM에 대한 가상 주소 매핑은 PAGE_OFFSET(0xffff800000000000) 위에 있습니다.
그러나 커널 이미지는 PAGE_OFFSET 아래인 vmalloc 가상 주소 공간에 위치합니다.

이러한 이유로 arm64에서는 arm32와 다르게 가상 주소와 물리 주소의 변환을 하기 위해 커널 이미지에 대해서는 별도의 주소 변환 매크로 함수를 사용합니다.

일반적으로 사용하는 가상 주소와 물리 주소의 변환은 다음 매크로 함수를 사용합니다.
virt_to_phys() - 가상 주소 -> 물리 주소로 변환
phys_to_virt() - 물리 주소 -> 가상 주소로 변환

그러나 커널 이미지에 대해서는 다음과 같은 매크로 함수를 사용합니다.
virt_to_phys() - 가상 주소 -> 물리 주소로 변환 (위의 API와 동일합니다)
__phys_to_kimg() - 물리 주소 -> 이미지가 위치한 가상 주소로 변환

도움이 되시길 바랍니다.
감사합니다.

문영일 드림.

SeokHoon Yoon

unread,
Aug 29, 2018, 3:32:36 AM8/29/18
to linux-ke...@googlegroups.com, ppbu...@gmail.com
안녕하세요 독자님,

답장이 저희 메일링리스트 계정으로만 전달이 된걸 이제서야 확인했네요.
전달 드립니다.

감사합니다.
윤석훈 드림.

2018년 7월 3일 (화) 오후 11:20, <jakei...@gmail.com>님이 작성:
--
Google 그룹스 'Linux Kernel ARM' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 linux-kernel-a...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 linux-ke...@googlegroups.com(으)로 이메일을 보내세요.
https://groups.google.com/group/linux-kernel-arm에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

Yun Levi

unread,
Aug 29, 2018, 9:19:01 AM8/29/18
to SeokHoon Yoon, linux-ke...@googlegroups.com
안녕하세요. 리눅스 커널 분석 저자님들.

부족했던 질문을 친절하게 답변해 주셔서 감사드립니다.

덕분에 다시 명료하게 정리될 수 있었습니다.

세세하게 신경써 주셔서 고맙습니다.

좋은 하루 되십시오.

HTH,
Levi

2018년 8월 29일 (수) 오후 4:32, SeokHoon Yoon <iamy...@gmail.com>님이 작성:

SeokHoon Yoon

unread,
Aug 31, 2018, 4:46:41 AM8/31/18
to Yun Levi, linux-ke...@googlegroups.com
도움이 되셨다면 다행입니다^^
꼭 책이 아니더라도 arm 커널 코어 관련된 궁금한게 있으시면 다시 메일주세요!

감사합니다.
윤석훈 드림.

Sent from my iPhone
Reply all
Reply to author
Forward
0 new messages