cafe.naver.com/embeddedcrazyboys

Slides:



Advertisements
Similar presentations
안양대학교 전기전자공학과 서 삼 준 Kernel Image Generation.
Advertisements

시스템 프로그래밍 박진희 컴퓨터 시스템 연구실. 2 Project 3 Key-value store 유일한 Key 에 하나의 Value 를 가지고 있는 방식 - Key 와 Value 를 쌍으로 관리 - Hash table, B-Tree, B+ Tree 등 분산형 데이터베이스에서.
2013 년 2 학기 임베디드 프로그래밍. 권장사양  HOST PC 권장사항  리눅스 배포판이 설치된 PC - 권장 배포판 : Asianux open edition3 ( 라곤 하지만 Ubuntu, Fedora, CentOS 등 다양한 리눅스 프랫폼이 가능 )  PC.
2013학년도 3-1 정보컴퓨터공학부 컴퓨터 소프트웨어 설계 및 실험
공교육 정상화 및 선행학습 금지 학부모 연수 부천송일초등학교.
1월 19일 주일오전예배 핸드폰 전원을 꺼주시기 바랍니다.
조교: 컴퓨터 응용 실험 컴퓨터공학 연구실 2005년 11월 10일
Linux Debugging issues
Root File System 충북대학교 지능로봇연구실.
임베디드 시스템 개발 환경 (1) Lecture #3.
임베디드 시스템 개발을 위한 리눅스 환경설정.
5과 하나님의 말씀인 성경.
05. gcc, make, gdb.
2017 은광교회 청년디모데 여름 수련회 ( ).
부트로더 Blob.
Windows CE 시스템 개발 환경 구축.
제6장 FUSING.
Cross Compiler를이용한 커널 컴파일 및 포팅
개발 환경 개발 환경 개요 PXA270과 타겟 시스템 툴체인 환경 구축 JTAG 유틸리티 미니컴 Make 유틸리티
크로스 컴파일 환경 구축.
Kernel Porting Lecture #7.
제4장 Cross Compiler 설치.
Minicom,tftp,nfs설정,vnc설정
FUSING.
임베디드 프로그래밍 Lecture #
디바이스 드라이버.
제8장 커널 & 파일 시스템 분석.
Linux를 이용한 Embedded 장비 개발
작 성 자: 김선영 메 일: sunyzero (at) gmail (dot) com 버 전: 1.30
목차 커널의 개념 및 기능 커널 포팅 램디스크.
<리눅스 무료백업툴 REAR>
WinCE Bootloader Porting
MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성.
Embedded System Porting (2)
Step Motor Device Driver
부트 로더 (blob pre2 중심) Lecture #8.
Geek-OS Project 정영진
Kernel 2.6 makefile 분석 LKSAS 3기 송형주.
커널 모듈 프로그래밍 (Kernel Module Programming)
Tproxy설정.
부트로더와 커널 이미지 부트로더 개요 타겟 시스템 부트로더 분석 부트로더 생성 커널 빌드 과정 커널 컴파일 규칙 커널 포팅
HBE-SMIII-SV210 리눅스 커널과 디바이스 드라이버
실시간 자원 량 정보 제공을 결합한 Heartbeat
임베디드 소프트웨어 설계.
Linux/UNIX Programming
정보컴퓨터공학부 컴퓨터 소프트웨어 설계 및 실험
Mips cross compile OS LAB.
Soonchunhyang Medical Science (SMS)
문자 디바이스 드라이버 임베디드 시스템.
[ 포털 사이트 연관검색어/자동완성 등록 서비스 ]
「 LINUX IBM SpectrumScale 설치 가이드」
고구려,백제,신라의 건국과 발전 Start!
망고100 보드로 놀아보자 -12 커널 디렉토리 설명
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
Itbank solaris Pm 4:00 class 김 정 훈
Stepper Motor 디바이스 드라이버
Lecture Notes on Computer Networks 주 홍 택 컴퓨터공학과 계명대학교
Operating System Multiple Access Chatting Program using Multithread
C-언어와 기반구조 정보보호학과 이정수 교수.
쉽게 풀어쓴 C언어 Express 제2장 프로그램 개발 과정 C Express.
Command line tools 한국어 정보의 전산 처리
프린터 서버 최재우.
뇌를 자극하는 C 프로그래밍.
Kinect 설치 및 사용 컨텐츠제작프로젝트.
Web Server Install.
Makefile
C.
WinCE Bootloader Porting
Web & Internet [10] 입문 – input 태그
Eclipse를 이용한 Embedded Linux 응용 프로그램 개발
Presentation transcript:

cafe.naver.com/embeddedcrazyboys 망고100 보드로 놀아보자 -11 Kernel build 분석 http://cafe.naver.com/embeddedcrazyboys http://www.mangoboard.com cafe.naver.com/embeddedcrazyboys

커널 build 환경 분석 >(Top Dir)/Makefile 첫번째 라인에 위치 >커널 2.6.29 버전 사용 >ARCH?=arm 의미는 ARCH 의 값으로 arm있느냐 묻고, 없으면, arm 문자를 대입 >.cross_compile 이 있으면, .cross_compile 내용을 CROSS_COMPILE 로 사용 cafe.naver.com/embeddedcrazyboys

커널 build 환경 분석(Conf) #make mango100_android_defconfig 실행 시 Scripts/kconfig/Makefile에서 아래 코드 수행 %_defconfig: $(obj)/conf $(Q)$< -D arch/$(SRCARCH)/configs/$@ $(Kconfig) make –D arch/arm/configs/mango100_android_defconfig .config 파일생성 cafe.naver.com/embeddedcrazyboys

커널 build 환경 분석(Conf) #make menu_config 명령 실행 시 #make scripts/kconfig menuconfig 이 실행 됨 menuconfig: $(obj)/mconf $< $(Kconfig) .config 저장 cafe.naver.com/embeddedcrazyboys

커널 build 환경 분석(Conf) #make xconfig (QT3 Package 필요) #yum install qt* 명령으로 설치 “cannot find –lXi 에러 발생 시 #yum install libXi 실행 cafe.naver.com/embeddedcrazyboys

커널 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

커널 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

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

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-y1 := $(patsubst %/, %/lib.a, $(libs-y)) libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) libs-y := $(libs-y1) $(libs-y2) cafe.naver.com/embeddedcrazyboys

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

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

$(top)/Makefile 커널 빌드시, 명령 및 메시지 출력 옵션 커널 빌드시, 소스 코드 체크 옵션 빌드된 파일의 출력 디렉토리 지정 cafe.naver.com/embeddedcrazyboys

How to build vmlinux ?? -Makefile : 아키텍처 독립적인 부분 - arch/arm/Makefile : 아키텍처 종속적인 부분 cafe.naver.com/embeddedcrazyboys

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

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

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 섹션은 0x20008000 위치부터, 엔트리포인트는 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

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

결론 - Kernel Build Process cafe.naver.com/embeddedcrazyboys

참고 : kernel Makefile 계층도 cafe.naver.com/embeddedcrazyboys

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

(예제) readelf -l arch/arm/boot/compressed/vmlinux cafe.naver.com/embeddedcrazyboys

참고 : 커널 빌드시, Log 남기기 make V=1 ARCH=arm 2>&1 | tee log-kernel.txt cafe.naver.com/embeddedcrazyboys