Download presentation
Presentation is loading. Please wait.
1
cafe.naver.com/embeddedcrazyboys
망고100 보드로 놀아보자 -11 Kernel build 분석 cafe.naver.com/embeddedcrazyboys
2
커널 build 환경 분석 >(Top Dir)/Makefile 첫번째 라인에 위치 >커널 2.6.29 버전 사용
>ARCH?=arm 의미는 ARCH 의 값으로 arm있느냐 묻고, 없으면, arm 문자를 대입 >.cross_compile 이 있으면, .cross_compile 내용을 CROSS_COMPILE 로 사용 cafe.naver.com/embeddedcrazyboys
3
커널 build 환경 분석(Conf) #make mango100_android_defconfig 실행 시
Scripts/kconfig/Makefile에서 아래 코드 수행 %_defconfig: $(obj)/conf $(Q)$< -D $(Kconfig) make –D arch/arm/configs/mango100_android_defconfig .config 파일생성 cafe.naver.com/embeddedcrazyboys
4
커널 build 환경 분석(Conf) #make menu_config 명령 실행 시
#make scripts/kconfig menuconfig 이 실행 됨 menuconfig: $(obj)/mconf $< $(Kconfig) .config 저장 cafe.naver.com/embeddedcrazyboys
5
커널 build 환경 분석(Conf) #make xconfig (QT3 Package 필요)
#yum install qt* 명령으로 설치 “cannot find –lXi 에러 발생 시 #yum install libXi 실행 cafe.naver.com/embeddedcrazyboys
6
커널 build 실행 분석 $(TOP)/Makefile – 최상위 Makefile vmlinux와 modules 생성
.config – 커널 설정 파일 make [config | menuconfig | xconfig] 를 통해 생성. arch/$(ARCH)/Makefile - 아키텍처별 makefile scripts/Makefile.* - 모든 kbuild Makefile에 사용되는 규칙이 들어있는 파일 kbuild Makefiles – 약 500개 정도가 있다. cafe.naver.com/embeddedcrazyboys
7
커널 build 실행 분석 커널 설정 (make config|menuconfig|xconfig)
커널 버전을 include/linux/version.h 에 저장 include/asm-$(ARCH)에 대한 심볼릭 링크 만듬 arch/$(ARCH)/Makefile 에서 정의된, 그외의 타겟 빌딩을 위한 모든 종속 리스트를 준비 init-*, core-*, driver-*, net-* 등의 타겟 등을 만듬 모든 오브젝트들이 링크되고, 소스 트리의 루트 디렉토리에 vmlinux를 만듬. 최종 부트이미지(zImage)를 만들기 위한 아키텍처에 따른 부분이 실행됨 cafe.naver.com/embeddedcrazyboys
8
Built-in object goals (obj-y)
specifying object files for vmlinux “$(LD) –r” : to merge $(obj-y) files into one built-in.o file ex. $(TOP)/kernel/Makefile ./arch/arm/xxx/built-in.o /drivers/built-in.o /drivers/xxx/built-in.o vmlinux ./firmware/built-in.o 컴파일 후 #find . –name built-in.o 명령으로 확인 ./fs/built-in.o ./fs/xxx/built-in.o ./kernel/built-in.o ./lib/built-in.o … cafe.naver.com/embeddedcrazyboys
9
Built-in object goals (obj-y)
echo "(patsubst pattern,replacement,text)" vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ $(net-y) $(net-m) $(libs-y) $(libs-m))) vmlinux-alldirs := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \ $(init-n) $(init-) \ $(core-n) $(core-) $(drivers-n) $(drivers-) \ $(net-n) $(net-) $(libs-n) $(libs-)))) init-y := $(patsubst %/, %/built-in.o, $(init-y)) core-y := $(patsubst %/, %/built-in.o, $(core-y)) drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)) net-y := $(patsubst %/, %/built-in.o, $(net-y)) libs-y := $(patsubst %/, %/lib.a, $(libs-y)) libs-y := $(patsubst %/, %/built-in.o, $(libs-y)) libs-y := $(libs-y1) $(libs-y2) cafe.naver.com/embeddedcrazyboys
10
Loadable module goals – (obj-m)
object files which are built as loadable kernel modules. ex. $(TOP)/driver/scsi/Makefile ex. $(TOP)/.config 참고!! 커널에 포함되지 않은 external module을 컴파일 하기위해서는 Documentation/kbuild/modules.txt를 참조 디바이스 드라이버 개발 cafe.naver.com/embeddedcrazyboys
11
Environment Variables
value Description V 빌드시에, 현재 컴파일되는 파일명만을 보여줌. (default) 1 빌드시에 실행되는 모든 명령 및 메시지를 보여줌. O dir 컴파일 되는 모든 output file들을 dir에 저장되게 지정 C 빌드과정에서 sparse tool이 컴파일된 파일을 체크하게끔 한다. sparse은 커널 소스 파일의 프로그래밍 에러를 찾는 툴이다. 2 sparse tool은 컴파일에 관계없이 모든 파일을 체크하게끔 한다. cafe.naver.com/embeddedcrazyboys Example :# make V=1 ARCH=arm
12
$(top)/Makefile 커널 빌드시, 명령 및 메시지 출력 옵션 커널 빌드시, 소스 코드 체크 옵션
빌드된 파일의 출력 디렉토리 지정 cafe.naver.com/embeddedcrazyboys
13
How to build vmlinux ?? -Makefile : 아키텍처 독립적인 부분
- arch/arm/Makefile : 아키텍처 종속적인 부분 cafe.naver.com/embeddedcrazyboys
14
Building vmlinux vmlinux는 $(vmlinux-init)와 $(vmlinux-main)에서 정의된 오브젝트로 만들어진다. 각 오브젝트의 linking 순서가 중요. 링커스크립트 지정 ld [옵션] 오브젝트파일 .. -m : 어떤 포맷으로 출력물을 만들 것인가?? -T: 링커 스크립트 지정 --start-group ~ --end-group : ~에 지정된 오브젝트들 서로간에 변수나 함수 참조를 가능하게 함. -o : 출력 파일명 지정 $(vmlinux-init) $(head-y) $(init-y) $(vmlinux-main) vmlinux $(core-y) $(libs-y) $(drivers-y) $(net-y) kallsyms.o cafe.naver.com/embeddedcrazyboys
15
Building zImage (1/3) 1. arch/arm/boot/compressed/Image
$(topdir)/vmlinux에서 .note 섹션, .comment 섹션 및 모든 심볼들과 재배치 정보들을 제거한 후, 인스트럭션 데이터만을 뽑아, arch/arm/boot/compressed/Image 라는 바이너리 파일을 만든다. arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/arm/boot/Image objcopy [옵션] 입력파일 [출력파일] -O오브젝트형식: 어떤 오브젝트 형식으로 출력 파일을 만들 것인지 지정 (예: elf32-i386, binary) -R 섹션 : 출력 파일에서 해당 섹션을 지운다. -S : 입력 파일의 재배치 정보와 심볼 정보를 출력 파일에 복사하지 않는다. 2. arch/arm/boot/compressed/piggy.gz 1단계에서 만든, Image을 가장 압축률이 좋은 방법으로 압축해서(-9), piggy.gz을 만듬 gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz cafe.naver.com/embeddedcrazyboys
16
Building zImage (2/3) 3. arch/arm/boot/compressed/piggy.o
arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d -nostdinc -isystem /usr/local/arm/4.2.2-eabi/usr/bin-ccache/../lib/gcc/arm-unknown-linux-gnueabi/4.2.2/include -Iinclude -I/home/icanjji/work/mango100/mango100_kernel_2010_06_30/arch/arm/include -include include/linux/autoconf.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-s5pc100/include -Iarch/arm/plat-s5pc1xx/include -Iarch/arm/plat-s3c/include -D__ASSEMBLY__ -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=7 -march=armv5t -Wa,-march=armv7-a -msoft-float -gdwarf-2 -Wa,-march=all -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 4. arch/arm/boot/compressed/vmlinux head.o + misc.o + piggy.o 를 링킹해서, vmlinux를 만듬, 이 때 .text 섹션은 0x 위치부터, 엔트리포인트는 startup_32로 지정한다. ld [옵션] 오브젝트파일 .. -m emulation : 링커에게 해당 타겟 emulation에 맞는 정보를 제공 (예. 링커 스크립트 등) -r : 재할당 가능한 출력 파일을 생성. 즉, ld의 입력 오브젝트로 쓰일 수 있는 출력 파일을 생성 (실제로 piggy.o는 ld로 다시 링킹됨) --format input-format : 입력 오브젝트 파일의 형식 지정 --oformat output-format : 출력 오브젝트 파일의 형식 지정. -o : 출력 파일명 지정 -Ttext org : text 섹션의 시작주소를 org로 지정 -e entry : 엔트리 포인트를 지정한다. cafe.naver.com/embeddedcrazyboys
17
Building zImage (3/3) 5. arch/arm/boot/zImage
4단계에서 만든 vmlinux에서 .note 섹션, .comment 섹션 및 모든 심볼들과 재배치 정보들을 제거한 후, 인스트럭션 데이터만을 뽑아, arch/arm/boot/zImage 라는 바이너리 파일을 만든다. arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage cafe.naver.com/embeddedcrazyboys
18
결론 - Kernel Build Process
cafe.naver.com/embeddedcrazyboys
19
참고 : kernel Makefile 계층도
cafe.naver.com/embeddedcrazyboys
20
Start entry 포인트는 _start
vmlinux.lds 첫 부분. OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0; _text = .; .text : { _start = .; *(.start) *(.text) *(.text.*) *(.fixup) *(.gnu.warning) *(.rodata) *(.rodata.*) *(.glue_7) *(.glue_7t) *(.piggydata) . = ALIGN(4); } Start entry 포인트는 _start cafe.naver.com/embeddedcrazyboys
21
(예제) readelf -l arch/arm/boot/compressed/vmlinux
cafe.naver.com/embeddedcrazyboys
22
참고 : 커널 빌드시, Log 남기기 make V=1 ARCH=arm 2>&1 | tee log-kernel.txt
cafe.naver.com/embeddedcrazyboys
Similar presentations