아래 명령어로 라즈베리파이 소스 다운로드를 하고,
git clone --depth=1 https://github.com/raspberrypi/linux.git
크로스 컴파일러 툴을 설치한 다음에,
git clone https://github.com/raspberrypi/tools
커널 빌드를 하면 vmlinux을 추출할 수 있습니다.
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j12
아래 명령어로 라즈베리파이 섹션 정보를 파악할 수 있는데요. 조금 더 짚어 보겠습니다.
./objdump -x vmlinux | more
섹션이란 용어에 대해서 설명을 하겠습니다. 섹션은 임베디드 소스 빌드 시 쓰이는 개념인데, 비슷한 속성의 코드들을 묶어서 처리하면 용이하기 때문에 리눅스 커널서도 활용합니다. 각 섹션 정보를 리눅스 lds 파일에서 정의합니다만, 일단 이 페이지에서는 라즈베리파이 리눅스 커널의 섹션 정보 리뷰를 하겠습니다.
[1]: 스타트업 코드: .head.text 섹션에 위치하고 실행 시작 주소는 0x80008000입니다.
리눅스 커널 코드를 정해진 메모리 공간에 로딩해 놓으면 0x80008000 주소부터 실행됩니다.
[2]: 커널 함수: 우리가 볼 수 있는 대부분 커널 함수들은 .text 영역에 위치해 있습니다.
[3]: __init 이란 매크로를 드라이버 실행 함수에 많이 붙힙니다. 이 함수들이 위치한 섹션이 .init.data입니다.
커널이 부팅할 때 do_initcall 함수를 호출할 때 .init.data 섹션에 있는 함수들을 차례 차례 실행합니다.
[4]: per-cpu 타입 데이터들은 모두 data..percpu 섹션에 위치합니다.
Sections:
Idx Name Size VMA LMA File off Algn
0 .head.text 0000026c 80008000 80008000 00008000 2**2 //<<--[1]
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .text 00607618 80100000 80100000 00010000 2**6 //<<--[2]
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .fixup 0000001c 80707618 80707618 00617618 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .rodata 001b8c84 80800000 80800000 00618000 2**12
CONTENTS, ALLOC, LOAD, DATA
4 __bug_table 00006534 809b8c88 809b8c88 007d0c88 2**2
CONTENTS, ALLOC, LOAD, DATA
5 __ksymtab 00007918 809bf1bc 809bf1bc 007d71bc 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 __ksymtab_gpl 00006738 809c6ad4 809c6ad4 007dead4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 __kcrctab 00003c8c 809cd20c 809cd20c 007e520c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 __kcrctab_gpl 0000339c 809d0e98 809d0e98 007e8e98 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 __ksymtab_strings 0002120e 809d4234 809d4234 007ec234 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 __param 00001374 809f5444 809f5444 0080d444 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 __modver 00000848 809f67b8 809f67b8 0080e7b8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
12 __ex_table 00000f20 809f7000 809f7000 0080f000 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
13 .ARM.unwind_idx 00034f70 809f7f20 809f7f20 0080ff20 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .ARM.unwind_tab 0004f58c 80a2ce90 80a2ce90 00844e90 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .notes 00000024 80a7c41c 80a7c41c 0089441c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
16 .vectors 00000020 ffff0000 80b00000 00898000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
17 .stubs 000002c0 ffff1000 80b00020 00899000 2**5
CONTENTS, ALLOC, LOAD, READONLY, CODE
18 .init.text 0004274c 80b002e0 80b002e0 008a02e0 2**5 //<<--[3]
CONTENTS, ALLOC, LOAD, READONLY, CODE
19 .exit.text 000014bc 80b42a2c 80b42a2c 008e2a2c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
20 .init.proc.info 0000023c 80b43ee8 80b43ee8 008e3ee8 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
21 .init.arch.info 000000d0 80b44124 80b44124 008e4124 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
22 .init.tagtable 00000010 80b441f4 80b441f4 008e41f4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
23 .init.smpalt 0000ede8 80b44204 80b44204 008e4204 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
24 .init.pv_table 000008a8 80b52fec 80b52fec 008f2fec 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
25 .init.data 00022b74 80b54000 80b54000 008f4000 2**12
CONTENTS, ALLOC, LOAD, DATA
26 .data..percpu 00006400 80b77000 80b77000 00917000 2**6 //<<--[4]
CONTENTS, ALLOC, LOAD, DATA
27 .data 000798e4 80c00000 80c00000 00920000 2**6
CONTENTS, ALLOC, LOAD, DATA
28 .data..page_aligned 00001000 80c7a000 80c7a000 0099a000 2**12
CONTENTS, ALLOC, LOAD, DATA
29 .bss 000c09a4 80c7b000 80c7b000 0099b000 2**6
ALLOC
30 .comment 0000005b 00000000 00000000 0099b000 2**0
CONTENTS, READONLY
31 .ARM.attributes 0000002f 00000000 00000000 0099b05b 2**0
CONTENTS, READONLY
최근 덧글