24
LINUX KERNEL COMPILE Jo, Heeseung

LINUX KERNEL COMPILEcslab.jbnu.ac.kr/course/2018.1/es/7.kernel build.pdf · 2018-03-22 · 3 리눅스 커널의 이해 커널의 종류 • Monolithic kernel: Solaris, AIX, HP-UX,

  • Upload
    dinhdan

  • View
    223

  • Download
    0

Embed Size (px)

Citation preview

LINUX KERNEL COMPILE

Jo, Heeseung

2

리눅스 커널의 이해

커널의 개요

• 커널은 리눅스 운영체제를 이루는 가장 핵심적인 소프트웨어

- 리눅스 커널이 곧 리눅스 운영체제

커널의 종류

• Micro kernel

- 커널이 가져야 하는 핵심적인 기능만을 구현한 최소 커널로써나머지는 user level 서비스 프로세스로 구성

• Monolithic kernel

- 커널 내부에 시스템 운영에 필요한 많은 서비스 루틴들 구조를 포함

3

리눅스 커널의 이해

커널의 종류

• Monolithic kernel: Solaris, AIX, HP-UX, Linux 등

• Micro kernel: Mach OS, sunsoft, Digital UNIX 등

4

리눅스 커널의 이해

커널의 구조

• 프로세스 관리, 메모리 관리, 파일 시스템 관리, 디바이스 관리, 네트워크 관리의 5개의 기능을 블록으로 구분

8

리눅스 커널 컴파일

커널 소스 설치

• HBE-SM5-S4210의 커널 소스는 웹페이지에서 다운로드

• /working 디렉터리로 이동한 후, wget으로 다운로드

• 커널 소스 파일 압축을 해제

root@ubuntu:# cd /working/root@ubuntu:/working# tar xjvf linux-2.6.35-s4210.tar.bz2

9

리눅스 커널 컴파일

커널 소스 설치

• 압축된 커널 소스의 압축을 해제하면 /working/linux-2.6.35-s4210 디렉터리가 생성

• 이 디렉터리가 커널 최상위 디렉터리

• 작업을 위해서 커널 최상위 디렉터리로 이동

root@ubuntu:/working# cd linux-2.6.35-s4210root@ubuntu:/working/linux-2.6.35-s4210#

10

리눅스 커널 컴파일

커널 소스 디렉토리(커널 소스트리)

• 커널 소스 최상위 디렉터리에서 ls 명령어로 소스 확인

11

리눅스 커널 컴파일

커널 소스 디렉토리(커널 소스 트리)

• arch : 모든 아키텍쳐 및 cpu에 종속적인 커널 코드

• crypto : 암호화 관련 코드

• drivers : 모든 디바이스 드라이버 코드

- 디바이스 드라이버는 크게 블록 디바이스 드라이버, 문자 디바이스드라이버, 네트워크 디바이스 드라이버로 구분

- 각각 block, char, net 서브디렉터리에 구현

• fs : 모든 파일 시스템 관련 코드

• include : 커널 코드의 헤더파일

- 아키텍쳐 의존적인 헤더파일은 asm으로 시작하는 서브디렉터리에위치

12

리눅스 커널 컴파일

커널 소스 디렉토리(커널 소스 트리)

• init : 커널의 초기화 코드

- 메인 시작 함수가 존재하므로 커널이 어떻게 동작하는지 분석하기위해 시작하기 좋은 곳

• ipc : 커널의 프로세스간 통신 코드

- 메시지 큐, 파이프, 공유 메모리, 세마포어, 소켓 등과 관련된 코드

• kernel : 커널 관리 루틴의 코어

- 프로세스, 인터럽트 처리, 타이머, 시그널처리, 프로그램 실행 등의처리를 담당

- 컨텍스트 스위칭 같은 아키텍쳐 종속적인 커널 코드는 arch/해당아키텍쳐/kernel에 존재

• lib : 커널의 라이브러리 코드

- 아키텍쳐에 종속적인 라이브러리 코드는 arch/해당 디렉터리/lib/에위치

13

리눅스 커널 컴파일

커널 소스 디렉토리(커널 소스 트리)

• mm : 모든 메모리 관련 코드

- 가상 메모리 처리 루틴

- 커널 메모리 할당 및 해제를 처리하는 루틴

- 아키텍쳐 종속적인 코드는 arch/해당 디렉터리/mm/에 있음

• net : 커널의 네트워크 관련 코드

• scripts : 커널을 설정하는데 사용되는 스크립트

- 예를 들어 awk 나 tlk 스크립트

• security : SELinux 지원 코드

• sound : 사운드 지원 코드

• usr : initramfs 관련 코드

• Documentation : 커널 소스 코드에 관한 모든 설명 문서

- 커널 개발자들에게 대단히 유용하며 커널을 분석할 때 이 디렉터리에있는 다양한 문서를 읽어보면 도움이 됨

14

리눅스 커널 컴파일

커널 컴파일

• 리눅스 커널 소스는 Kbuild system에 의해서 컴파일

• Kbuild는 리눅스 커널에서 제공하는 kernel build를 표준화한내용

• 커널 소스트리 각각에는 Kbuild Makefile들이 존재하며, make 명령 실행시 이 파일들을 가지고 컴파일을 하게 됨

• Kbuild system은 커널 소스 트리의 최상위 디렉터리의 .config파일을 가지고 커널을 컴파일

• .config 파일은 리눅스 최상위 디렉터리에 존재하고 있는 파일로현재 리눅스의 설정 정보를 가지고 있음

• 커널 옵션 설정을 하게 되면 .config 파일이 생성됨

15

리눅스 커널 컴파일

커널 컴파일

• make 명령어

- 다음과 같이 커널 최상위 디렉터리에서 make help를 치면 make 명령어와 같이 사용할 수 있는 옵션들을 확인 할 수 있음

16

리눅스 커널 컴파일

root@ubuntu:/working/linux-2.6.35-s4210# make help---------------------------------<출력내용>-------------------------------------Cleaning targets:clean - Remove most generated files but keep the config and

enough build support to build external modulesmrproper - Remove all generated files + config + various backup filesdistclean - mrproper + remove editor backup and patch files

Configuration targets:config - Update current config utilising a line-oriented programmenuconfig - Update current config utilising a menu based programxconfig - Update current config utilising a QT based front-end

-----------------------------------<중략>--------------------------------------Architecture specific targets (arm):* zImage - Compressed kernel image (arch/arm/boot/zImage)Image - Uncompressed kernel image (arch/arm/boot/Image)

* xipImage - XIP kernel image, if configured (arch/arm/boot/xipImage)uImage - U-Boot wrapped zImagebootpImage - Combined zImage and initial RAM disk

(supply initrd image via make variable INITRD=<path>)install - Install uncompressed kernel

-----------------------------------<중략>--------------------------------------sm5s4210_android_defconfig - Build for sm5s4210_androidsm5s4210_linux_defconfig - Build for sm5s4210_linuxsmdkc210_android_defconfig - Build for smdkc210_androidsmdkv310_android_defconfig - Build for smdkv310_android

-----------------------------------<중략>--------------------------------------

17

리눅스 커널 컴파일

커널 컴파일

• make xxx_defconfig 명령

- 커널 옵션 설정을 한번에 설정

- make xxx_defconfig 명령어를 실행하게 되면, arch/$(ARCH)/configs/xxx_defconfig 파일을 커널 최상위디렉터리의 .config 파일로 복사함

• HBE-SM5-S4210의 경우

- make sm5s4210_linux_defconfig 명령어를 실행

- arch/arm/configs/sm5s4210_linux_defconfig 파일을 커널 소스최상위 디렉터리의 .config 파일로 복사

18

리눅스 커널 컴파일

커널 컴파일

• make menuconfig 명령

- 이 명령은 커널을 컴파일 할 때 추가/삭제하여야 할 것을 선택

- 커널에서 필요한 부분을 추가/삭제할 수 있어 좀 더 최적화된 커널을build 할 수 있음

- 패치를 통해 HBE-SM5-S4210 보드에 맞게 커널 구성을 하였으므로, 특별한 경우를 제외하고 위 메뉴에서 수정이 필요 없음

- 사용자에 따라 커널 테스트를 원하면 변경해 가면서 컴파일을 진행할수 있음

19

리눅스 커널 컴파일

커널 컴파일

• make clean 명령

- 컴파일 수행 후 생성된 여러 오브젝트 파일을 삭제하는 명령

- 소스를 수정한 후 (주로 헤더파일) 컴파일 할 때 유용하게 사용

• make zImage 명령

- 실제 커널을 컴파일 하는 명령

- 압축 커널 이미지가 arch/arm/boot 디렉터리에 zImage라는 이름으로생성

- zImage의 처음 부분에 압축을 해제하는 코드가 포함

• make modules 명령

- 커널 환경설정에서 모듈로 설정한 기능들을 컴파일

- make modules_install 명령어를 통해서 컴파일된 모듈은/lib/modules 하위 디렉터리에 설치됨

20

리눅스 커널 컴파일

커널 옵션 설정

• 커널 컴파일 명령을 통해서 커널 이미지를 생성하기 전에 커널설정 과정이 필요

• 커널 설정 방법은 미리 만들어 놓은 설정 파일을 사용하는방법과 직접 menuconfig를 이용하여 설정하는 방법이 있음

root@ubuntu:/working/linux-2.6.35-s4210# make sm5s4210_linux_defconfig-------------------------<출력내용>--------------------HOSTCC scripts/basic/fixdepHOSTCC scripts/basic/docprocHOSTCC scripts/basic/hashHOSTCC scripts/kconfig/conf.oHOSTCC scripts/kconfig/kxgettext.oSHIPPED scripts/kconfig/zconf.tab.cSHIPPED scripts/kconfig/lex.zconf.cSHIPPED scripts/kconfig/zconf.hash.cHOSTCC scripts/kconfig/zconf.tab.oHOSTLD scripts/kconfig/conf

## configuration written to .config#

21

eth kernel 버전 컴파일시

• Makefile에 arm-linux-gcc 수정해줄 필요 있음

• rt3070.bin 파일이 필요하고, 참조하는 위치를 수정해 줘야함

wifi kernel 버전 컴파일시

• Makefile에 arm-linux-gcc 수정해줄 필요 있음

• Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.

- kernel/timeconst.pl에서 해당 부분 삭제

22

리눅스 커널 컴파일

커널 컴파일 실행

• 커널 컴파일이 완료되면, 압축 커널 이미지가 arch/arm/boot 디렉터리에 zImage라는 이름으로 생성

root@ubuntu:/working/linux-2.6.35-s4210# rm -f arch/arm/boot/zImageroot@ubuntu:/working/linux-2.6.35-s4210# make zImage

LD vmlinuxSYSMAP System.mapSYSMAP .tmp_System.mapOBJCOPY arch/arm/boot/ImageKernel: arch/arm/boot/Image is readyAS arch/arm/boot/compressed/head.oGZIP arch/arm/boot/compressed/piggy.gzAS arch/arm/boot/compressed/piggy.oCC arch/arm/boot/compressed/misc.oLD arch/arm/boot/compressed/vmlinuxOBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is ready

root@ubuntu:/working/linux-2.6.35-s4210#

23

리눅스 커널 컴파일

컴파일이 정상적으로 완료되었는지 확인

• zImage 파일의 날짜를 확인

vi firmware/rt3070.bin.gen.S

root@ubuntu:/working/linux-2.6.35-s4210# ll arch/arm/boot/zImage-rwxr-xr-x 1 root root 3839072 2016-04-01 03:22 arch/arm/boot/zImage*

24

리눅스 커널 컴파일

커널 드라이버 모듈 컴파일

• 커널 컴파일 후에 드라이버 모듈을 컴파일

CHK include/linux/version.hmake[1]: `include/asm-arm/mach-types.h' is up to date.CHK include/linux/utsrelease.hSYMLINK include/asm -> include/asm-armCALL scripts/checksyscalls.sh

//...생략CC crypto/aes_generic.mod.oLD [M] crypto/aes_generic.koCC crypto/ansi_cprng.mod.oLD [M] crypto/ansi_cprng.koCC drivers/media/video/gspca/gspca_main.mod.oLD [M] drivers/media/video/gspca/gspca_main.koCC drivers/scsi/scsi_wait_scan.mod.oLD [M] drivers/scsi/scsi_wait_scan.ko

root@ubuntu:/working/linux-2.6.35-s4210#

root@ubuntu:/working/linux-2.6.35-s4210# make modules

25

부트로더에서 이미지 다운로딩 및 이미지 퓨징

현재 커널의 버전 확인

• uname -a

- Linux SM5S4210 2.6.35.7 #5 SMP PREEMPT Tue Dec 6 18:10:40 PST 2011 armv7l unknown

• 2.6.35.7: kernel의 버전

• #5: 컴파일 회수

• 이미지 업데이트 후 uname -a 명령으로 #6 으로 버전이올라가는지 확인

26

부트로더에서 이미지 다운로딩 및 이미지 퓨징

커널이미지 다운로드 및 퓨징

• 부트로더 퓨징과 마찬가지로 부트로더 상에서 다음과 같이fastboot을 입력

• Linux fastboot 명령

SM5S4210 # fastboot[Partition table on MoviNAND]ptn 0 name='bootloader' start=0x4200 len=0x80000(~512KB) (use hard-coded info. (cmd: movi))ptn 1 name='kernel' start=0x8C000 len=0x400000(~4096KB) (use hard-coded info. (cmd: movi))ptn 2 name='logo' start=0x48C000 len=0x200000(~2048KB) (use hard-coded info. (cmd: movi))ptn 3 name='ramdisk' start=0x68C000 len=0x974000(~9680KB) (use hard-coded info. (cmd: movi))(전송을 기다리는 대기상태로 진입)

root@ubuntu:/tftpboot# fastboot.x64 flash kernel zImage

27

부트로더에서 이미지 다운로딩 및 이미지 퓨징

커널이미지 다운로드 및 퓨징

SM5S4210 # fastboot[Partition table on MoviNAND]ptn 0 name='bootloader' start=0x4200 len=0x80000(~512KB) (use hard-coded info. (cmd: movi))ptn 1 name='kernel' start=0x8C000 len=0x400000(~4096KB) (use hard-coded info. (cmd: movi))ptn 2 name='logo' start=0x48C000 len=0x200000(~2048KB) (use hard-coded info. (cmd: movi))ptn 3 name='ramdisk' start=0x68C000 len=0x974000(~9680KB) (use hard-coded info. (cmd: movi))Received 17 bytes: download:0032e644Starting download of 3335748 bytes...downloading of 3335748 bytes finishedReceived 12 bytes: flash:kernelflashing 'kernel'writing kernel.. 1120, 8192MMC write: dev # 0, block # 1120, count 8192 ... .8192 blocks written: OKcompletedpartition 'kernel' flashed