임베디드 리눅스 개발

38
임임임임 임임임 임임 임임 임임임 임임 임임임임 임임임임 임임 임임임임임 임임 임임 임임 임임 임임임 임임 임임임 임임 임임 임임 GUI 임 임임 임임 임임임임 임임 임임 임임임 임임

description

임베디드 리눅스 개발. 타겟 머신의 선택 임베디드 리눅스의 크기 소프트웨어 개발 툴의 선택 부팅 리눅스 커널 버전의 선택 쉘의 선택 GUI 의 선택 파일 시스템과 실행 파일 포맷의 선택. 타겟 머신의 선택. 임베디드 시스템의 하드웨어 선택은 임베디드 리눅스 개발의 첫번째 선택 사항 하드웨어 선택 시 고려 사항 개발 비용 개발 기간 개발 가능성 주변 장치 : 기 개발된 디바이스 드라이버가 존재하는것을 선택하는것이 유리. 임베디드 리눅스의 크기. 일반적으로 커널의 크기 커널 구성 요소 - PowerPoint PPT Presentation

Transcript of 임베디드 리눅스 개발

Page 1: 임베디드 리눅스 개발

임베디드 리눅스 개발

타겟 머신의 선택 임베디드 리눅스의 크기 소프트웨어 개발 툴의 선택 부팅 리눅스 커널 버전의 선택 쉘의 선택 GUI 의 선택 파일 시스템과 실행 파일 포맷의 선택

Page 2: 임베디드 리눅스 개발

타겟 머신의 선택

임베디드 시스템의 하드웨어 선택은 임베디드 리눅스 개발의 첫번째 선택 사항

하드웨어 선택 시 고려 사항 개발 비용 개발 기간 개발 가능성 주변 장치 : 기 개발된 디바이스 드라이버가

존재하는것을 선택하는것이 유리

Page 3: 임베디드 리눅스 개발

임베디드 리눅스의 크기

일반적으로 커널의 크기 커널 구성 요소 이를 구현한 프로그램의 크기

일반적인 리눅스 커널의 구성 요소 프로세스 관리 메모리 관리 프로세스간 통신 파일 시스템 관리 네트워크 관리 디바이스 드라이버

Page 4: 임베디드 리눅스 개발

최소의 임베디드 리눅스

임베디드 리눅스 커널 크기의 최소화 최소의 프로세스 관리

목표 시스템에 맞는 프로세스 관리부분만 선택필요한 스케줄러만 선택

메모리 관리적절한 메모리 관리 정책만 구현

프로세스간 통신사용될 통신 방법만 구현

파일 시스템 관리사용될 파일시스템과 최적의 호환성을 제공하는 파일 시스템만 구현

네트워크 관리필요한 통신 프로토콜만 구현

디바이스 드라이버필요한 경우에만 커널에 올릴 수 있게 구성

Page 5: 임베디드 리눅스 개발

소프트웨어 개발 툴의 선택

임베디드 시스템 개발 툴 : 호스트 시스템 위에서 사용할 수 있는 크로스 개발 툴 (cross-development tool) 을 사용

개발 툴의 구성 : 타겟 프로세서를 위한 크로스컴파일러 (cross-compiler) 어셈블러 (assembler) 링커 (linker) 아카이버 (archiver) 목적 파일생성 및 관리 툴

Page 6: 임베디드 리눅스 개발

Linux 커널 구조

Hardware ControlHardware Control

Hardware ControlHardware Control

CharChar BlockBlock

Device DriverDevice Driver

BufferBuffer

Virtual File SystemVirtual File SystemMemory ManagementMemory Management

Process ManagementProcess Management

System Call InterfaceSystem Call Interface

LibraryLibrary

Kernel Level

H/W Level

Kernel Level

User LevelUser Program & Application

Page 7: 임베디드 리눅스 개발

Linux 커널 구조 (2) 커널 (kernel) 이란 ?

메모리에 상주하여 시스템 구동에 필요한 환경을 만들고 관리하는 소프트웨어로써 H/W 와 인터럽트 등을 통해 통신하고 , 사용자 Application과 시스템 호출 인터페이스 등을 통해 통신하는 소프트웨어

작은 의미의 OS 자체 시스템 내의 모든 리소스 (H/W, S/W) 관리 응용 프로그램에게 서비스 제공

Process Management 태스크 생성 , 실행 , 상태전이 , 스케줄링 , 시그널 처리 , 프로세스간 통신 ,

모듈 등의 서비스를 관리 및 제공 Memory Management

가상 메모리 , 주소변환 , 페이지 부재 결함 처리 Virtual File System

파일 생성 , 접근 제어 , inode 관리 , 디렉터리 관리 , 버퍼 캐쉬관리 등 Device Driver

주변장치를 구동하는 드라이버로 구성

Page 8: 임베디드 리눅스 개발

Linux 커널 소스구조Top DirTop Dir

mmmm liblib

fsfs

kernelkernel scriptscript

DocumentDocument archarch

ipcipc

netnet driverdriver includeinclude

initinit

ext2ext2

jffs2jffs2

cramfscramfs

ipv4ipv4

ipv6ipv6

x25x25

charchar

blockblock

usbusb

asm-ppcasm-ppc

asm-armasm-arm

linuxlinux

kernelkernel

mmmm

bootboot

ppcppc

i386i386

armarm

… … … … ……

Page 9: 임베디드 리눅스 개발

Linux 커널 소스 구조 (2) init

커널의 초기화 부분 -> 커널의 메인 시작 함수가 구현된 디렉터리 kernel

Task 관리자가 구현된 디렉터리 Task 생성 , 소멸 , 프로그램의 실행 , 스케줄링 , 시그널 처리 , 모듈관련 , 커널 심볼 등이

구현 arch

H/W 에 종속적인 부분들이 구현 CPU 타입에 따라 하위 디렉터리로 다시 구분 /arch/cpu-type/ 에는 다시 5 개의 하위 디렉터리로 구성

boot – 시스템 초기화 시 이용하는 부트스트랩 코드가 구현 커널 소스 컴파일 시 결과물인 vmlinuz 파일도 여기에 생성

Kernel – Task 관리자중에서 Context switch 또는 thread 관리 같은 하드웨어 종속 적인 부분이 구현

mm- 메모리 관리자 중에서 페이지 부재 결함 처리와 같은 하드웨어 종속적인 부분 이 구현

lib- 커널이 사용하는 라이브러리 함수가 구현

Page 10: 임베디드 리눅스 개발

Linux 커널 소스 구조 (3) fs

Linux 에서 지원하는 다양한 파일 시스템들이 구현 open(), read(), write() 등의 시스템 호출이 구현 대표적 파일시스템 : ext2, nfs, ufs, ntfs, msdos, proc 등

mm 메모리 관리자가 구현 가상 메모리 , Task 마다 할당되는 메모리 객체 관리 , 커널 메모리 할당자 등의

기능이 구현 driver

디바이스 드라이버가 구현 문자 (character) 디바이스 드라이버 ->driver/char 블록 (Block) 디바이스 드라이버 ->driver/block 네트웍 (Network) 디바이스 드라이버로 구분됨 ->driver/net 기타 driver/cdrom, driver/sound, /driver/video 등으로 구성

Page 11: 임베디드 리눅스 개발

Linux 커널 소스 구조 (4) net

Linux 에서 지원하는 통신 프로토콜이 구현되어 있으며 socket 이 구현되어있음

지원 프로토콜 -> TCP/IP, PPP, X.25, IPX 등 다수 지원 net/ipv4, net/x25, net/802 등으로 구성

ipc Linux 커널이 지원하는 프로세스간 통신 (InterProcess Communication)

기능이 구현 대표적인 IPC -> 파이프 , 시그널 , SVR4 IPC, 소켓 등 메시지 패싱 , 공유 메모리 , 세마포어 가 구현되어 있음 참고 -> 파이프는 fs 디렉터리 , 시그널은 kernel 디렉터리 , 소켓은 net

디렉터리에 구현되어 있음 include

Linux 커널이 사용하는 헤더 파일들이 구현 헤더파일 중 H/W 독립적인 부분은 include/linux 하위 디렉터리에 구현

Page 12: 임베디드 리눅스 개발

Linux 커널 소스 구조 (5) Document

Linux 커널 및 명령어들에 대한 자세한 문서 파일들이 존재 lib

커널 라이브러리 한수들이 구현 module

컴파일 된 모듈 함수들이 존재 scripts

커널 구성 및 컴파일 할 때 이용되는 스크립터들이 존재

Page 13: 임베디드 리눅스 개발

커널 컴파일 옵션 설정 커널 컴파일 시 필요한 옵션 설정 방법

가장 먼저 Linux 소스가 있는 디렉터리로 이동 ( 예 :/kernel/src/linux-2.4.4/) #make menuconfig 입력

위와 같은 텍스트 메뉴 방식의 설정상자가 나타남 터미널 창에서 메뉴를 바로 지정하여 편리 -> 일반적으로 사용됨

Page 14: 임베디드 리눅스 개발

커널 컴파일 옵션 설정 (2) 커널 컴파일 옵션 메뉴를 정의하는 언어

소스코드 : arch/ppc/config.in 이 있으며 , 하부 디렉터리에 각 디렉터리에 대해 해당하는 Config.in 파일이 존재

Documentation/kbuild/config-language.txt menuconfig, xconfig 등을 실행하면 config.in 을 읽어서 텍스트 메뉴로

표현 커널 컴파일 옵션 설정 원리

#make menuconfig#make menuconfig 메뉴설정메뉴설정 설정저장설정저장

.config.config

include/linux/autoconf.hinclude/linux/autoconf.h

config.in 을 읽어서

메뉴로 표현

같은 내용을 두 가지

형태로 저장

Makefile 에서 이용

C 파일에서 이용

Page 15: 임베디드 리눅스 개발

커널 컴파일 #make mrproper

이전의 설정을 모두 제거 #make menuconfig

커널 설정 사항 변경 #make dep

커널 소스코드 사이의 의존관계 분석 -> .depend 파일에 저장 커널 소스코드의 위치를 변경하였을 경우 다시 make dep 을 해주어야 함

#make zImage zImage 생성 , 에러없이 완료되었을 경우 ./arch/ppc/boot 에 zImage 파일

생성 #make zImage -> make vmlinux.ppcboot

컴파일 완료 시 vmlinux, vmlinux.ppcboot, vmlinux.srec 파일이 생성됨 vmlinux 는 기존의 zimage 와 동일한 이미지 임 vmlinux.ppcboot 는 TFTP, vmlinux.srec 는 serial 을 이용하여 부팅할 때

사용하는 파일임

Page 16: 임베디드 리눅스 개발

커널 컴파일 (2)

#make mrproper

#make menuconfig

#make dep

#make zImage #make zImage -> make vmlinux.ppcboot

커널 컴파일 설정변경

커널 컴파일 설정변경

소스코드 수정 또는 파일이동

소스코드 수정 또는 파일이동

커널 컴파일 설정 및 저장

.depend 파일 생성

Page 17: 임베디드 리눅스 개발

커널 이미지 구조

head_8xx.ohead_8xx.o

main.o 일부main.o 일부

entry.oentry.o

ELF HeaderELF Header

Program HeaderProgram Header

.text.text

….

….

.data.data

….

….

.bss.bss

….

….

Section HeaderSection Header

trap.otrap.o

….

….

vmlinux.gzvmlinux.gz

vmlinux

objcopy 를 이용하여

실제 커널의 raw binary 이미지 생성

실제 커널의 raw binary 이미지 파일 실제 커널의

raw binary 압축파일

gzip 을 이용하여

압축

Page 18: 임베디드 리눅스 개발

부트 로더 (boot loader) 시스템의 하드웨어를 초기화하고 운영체제의 커널을 메모리에 올려 실행시키는

시스템 프로그램 JTAG/BDM -> 플래시 메모리에 부트 로더를 굽는 유틸리티 LETOK-850 에서는 BDM 을 이용하여 부트 로더를 굽게 됨

부트 로더의 위치 일반적으로 시스템 메모리의 물리 주소 0 번지부터 위치 롬 , 플래쉬롬 , SRAM 등 정적인 메모리에 위치

부트 로더의 기능 메모리 초기화 하드웨어 초기화

직렬포트의 초기화 네트워크 초기화 프로세서 속도 , 인터럽트의 초기화

커널과 램 디스크 적재 : 커널과 램 디스크를 램에 적재하여 실행 정적 메모리에 쓰는 기능 사용자 인터페이스 기능

Page 19: 임베디드 리눅스 개발

ppcboot

ppcboot PowerPC 플랫폼을 위한 Open Source 부트 로더 Linux 를 지원하며 네트워크를 이용한 부팅 기능 제공 소스 및 자료를 구할 수 있는 곳 -> http://ppcboot.sourceforge.net

제공 기능 BOOTP/TFTP (RARP/TFTP) 를 이용한 네트워크 부팅 initrd 를 이용한 메모리 (Flash memory, DRAM) 부팅 TFTP(Ethernet) 를 이용한 다운로드 Serial 을 이용한 다운로드

특징 실제 커널의 raw binary 압축 파일인 vmlinux.gz 사용 -> 압축커널 사용 않음 압축 커널 헤더 코드 (head.S) 역할 수행 커널 이미지와 initrd 이미지의 분리 가능 이미지 파일에 자체 헤더 정보 사용 -> mkimage 유틸리티를 이용하여 작성

Page 20: 임베디드 리눅스 개발

ppcboot(2) mkimage 유틸리티

이미지 파일에 자체 헤더 추가 ppc 플랫폼에 올라가는 Linux 커널 , initrd 이미지 모두 헤더 정보를

추가해야 함

사용 예# mkimage –n ‘myRamdisk’ –A ppc –O linux –T ramdisk –d

ramdisk.gz ramdisk.ppcboot CPU(-A)->ppc, OS(-O)->linux, 이미지 타입 (-T)->kernel, ramdisk

ppcboot 헤더ppcboot 헤더

vmlinux.gzvmlinux.gz

실제 커널의 raw binary

압축파일

vmlinux.gzvmlinux.gzmkimage

ppcboot 용커널

Page 21: 임베디드 리눅스 개발

ppcboot 용 커널 구조

head_8xx.ohead_8xx.o

main.o 일부main.o 일부

entry.oentry.o

ELF HeaderELF Header

Program HeaderProgram Header

.text.text

….

….

.data.data

….

….

.bss.bss

….

….

Section HeaderSection Header

trap.otrap.o

….

….

vmlinux

objcopy 를 이용하여

실제 커널의 raw binary 이미지 생성

실제 커널의 raw binary 이미지 파일

gzip 을 이용하여

압축

ppcboot 헤더ppcboot 헤더

vmlinux.gzvmlinux.gz

실제 커널의 raw binary

압축파일

vmlinux.gzvmlinux.gzmkimage

ppcboot 용커널

LETOK-850 의 경우 PPC 계열이므로위의 경우에 해당됨

Page 22: 임베디드 리눅스 개발

ppcboot 부팅– TFTP/NFS

vmlinuz.gzvmlinuz.gz

ppcbootppcbootLinux 커널Linux 커널

6. NFS Root

FS 마운트

6. NFS Root

FS 마운트

Flash memory

RAM RAM

Host

Target

1.TFTP request

2.TFTP reply

( 압축커널만 )

3. 압축커널다운로드

4. 커널분기

5. 분기 및커널압축

해제

Host Hard Disk(File System)

Page 23: 임베디드 리눅스 개발

부팅

부트로더 (boot loader) : 시스템의 전원을 켰을 때 자장 먼저 실행되는 부분

부트로더의 역할 램을 사용할 수 있도록 초기화 루트 파일시스템을 준비 자신을 램에 복사한 후 계속 실행됨 하드웨어의 초기화 커널을 램에 적재한 후 실행권 이양 호스트 시스템과의 통신 수단 제공

Page 24: 임베디드 리눅스 개발

부팅부트로더의 위치

일반적으로 시스템의 물리 주소 번지 0 부터 위치 롬 , 플래쉬롬 , SRAM 등 정적인 메모리에 위치

부트로더의 기능 메모리 초기화 하드웨어 초기화

직렬포트의 초기화네트워크 초기화프로세서 속도 , 인터럽트의 초기화

커널과 램디스크 적재 : 커널과 램디스크를 램에 적재하여 실행 정적 메모리에 쓰는 기능 사용자 인터페이스 기능

Page 25: 임베디드 리눅스 개발

부트로더

기능에 맞게 직접 작성기존에 존재하는 부트로더를 이용기존에 개발된 부트로더가 그대로 사용 불가능할 때

소스코드가 공개되어있고 라이선스 획득이 가능한 것을 선택 필요한 수정을 가하여 새로운 브트로더를 작성 많이 사용되는 것

LinuxBIOS(http://www.acl.lanl.gov/linuxbios/)Red Hat Inc. 의 RedBootBlob(http://www.lart.tudelft.nl)

Page 26: 임베디드 리눅스 개발

Blob 부트로더 흐름도

c_main()

wait for 10 seconds

BootKernel ()

run command

BootKernel () SetClock () Download() Flash() ......

Auto Boot Manual Boot

command mode

jump to kernel image address

GetCommand ()

serial inittimer initkernel, ramdisk image 를 ram 에 복사

Key pressed within 10 seconds

start.S

Page 27: 임베디드 리눅스 개발

Blob 파일 설명

start.S : 가장 먼저 실행되는 파일 인터럽트 disable CPU 클럭 설정 메모리 설정 직렬포트 설정 Stack Point 설정 c_main 루틴으로 점프

Page 28: 임베디드 리눅스 개발

Blob 파일 설명main.c : 모든 함수는 이 곳에서 관리하고

해당 함수는 각 해당 c 파일의 함수를 호출하여 수행

Page 29: 임베디드 리눅스 개발

boot

function

commandrun command

BootKernel ()

SetClock ()

Download()

Flash()

PringHelp ()

Reload()

ResetTerminal ()

SetDownloadSpeed ()

PrintStatus ()

clock

download

flash

help

reload

reset

speed

status

PrintSerialSpeed ()

serial

Kernel 이 있는 Ram 영역으로 Jump

Clock 설정

uudecode 를 이용하여Ram 에 Download

Ram 에서 Flash 로writing

Help 메시지 출력 현재 serial 의 speed 출력

현재 설정되어 있는상태를 출력

Speed 설정

Serial init

Flash 의 kernel, ramdisk를 ram 으로 copyboot

function

commandrun command

BootKernel ()

SetClock ()

Download()

Flash()

PringHelp ()

Reload()

ResetTerminal ()

SetDownloadSpeed ()

PrintStatus ()

clock

download

flash

help

reload

reset

speed

status

PrintSerialSpeed ()

serial

Kernel 이 있는 Ram 영역으로 Jump

Clock 설정

uudecode 를 이용하여Ram 에 Download

Ram 에서 Flash 로writing

Help 메시지 출력 현재 serial 의 speed 출력

현재 설정되어 있는상태를 출력

Speed 설정

Serial init

Flash 의 kernel, ramdisk를 ram 으로 copy

Page 30: 임베디드 리눅스 개발

리눅스 커널 버전의 선택커널 버전

역사 : http://www.linux.org/dist/kernel.html 버전 숫자 : X.Y.ZZ

X : 커널의 버전Y : 릴리즈 번호 , 홀수 -> 개발중 , 짝수 ->안정된 버전ZZ : 모디피케이션 , 사소한 변화를 의미

최신 버전새로운 다양한 기능이 이미 추가되어 있음크기가 매우 크다는 단점이 있음

커널 버전의 선택 임베디드 시스템의 크기를 고려 필요한 기능을 고려 확장성을 고려

Page 31: 임베디드 리눅스 개발

쉘의 선택

두가지 계열의 쉘 프로그램이 존재 본 (Bourne) 쉘 C 쉘

임베디드 시스템과의 대화에 필요한 초소한의 기능을 선택

사용의 편리성을 고려이러한 기능을 포함하는 가장 작은 크기의 쉘

프로그램을 선택

Page 32: 임베디드 리눅스 개발

GUI 의 선택 (1)

터치 스크린 위에서 아이콘과 가상 키보드 등을 이용하여 대화하는 시스템 : GUI 를 위한 윈도우 시스템과 윈도우 메니저가 필요

리눅스의 일반적인 윈도우 시스템과 메니저 X-Windows : twm, fvwm, olvwm, mwm, WindowMaker,

AfterStep, NeXTSTEP 등 소스코드가 공개되어 있음 무료 크기가 매우 큼 실행 시 많은 시스템 자원을 사용 임베디드 시스템에는 부적합

Page 33: 임베디드 리눅스 개발

GUI 의 선택 (2)

대안들 Mini X-Windows

소스코드가 공개되어 있음 무료 여전히 크기가 크고 시스템 자원을 많이 사용

Qt TrollTech 사에서 개발 소스코드가 공개되어 있음 GPL 버전의 무료 사용이 가능 여러 가지 운영체제를 위한 각각의 라이브러리가 존재 한번의 개발로 여러 운영체제 위에서 사용 가능

Page 34: 임베디드 리눅스 개발

GUI 의 선택 (3)

대안들 Qt/Embedded

Qt 를 경량화 하여 임베디드 시스템에 적합하게 개발됨모듈러하고 스키일러블 함 : 크기나 기능을 재구성 할

수 있음데스크탑용 Qt 위에서 프로그램 개발 -> 다시 컴파일

하여 임베디드 시스템에서 사용 가능

Page 35: 임베디드 리눅스 개발

GUI 의 선택 (4)

@win 국내의 아델리눅스에서 개발 다국어 지원이 가능 적은 디스크와 메모리를 사용 안정적이고 빠른 그래픽 환경을 제공 APL 버전의 무료 사용이 가능 데스크탑과 임베디드 시스템에서 모두 사용 가능 향후 소스코드가 공개될 것임

Page 36: 임베디드 리눅스 개발

GUI 의 선택 (5)

대안들 Microwindows

소스코드가 공개되어 있음 무료로 사용 가능 Xlib 및 Win32 와 호환됨 현재 개발 중 ( 버전 0.89pre7)

Page 37: 임베디드 리눅스 개발

파일 시스템과 실행 파일 포멧 선택

현재 리눅스에서 지원되는 파일 포멧 : 10 여 종임베디드 시스템을 위한 파일 시스템

2~3 종이면 충분 EXT2 : 리눅스 전용 , 임베디드 시스템에서도

일반적으로 지원 XIP(Execute-in-Place)

롬이나 플래쉬롬에 있는 프로그램을 램에 적재하지 않고 그곳에서 바로 실행

램에 대한 메모리 요구량을 줄여 줌많은 응용프로그램이 동시에 실행 가능

Page 38: 임베디드 리눅스 개발

파일 시스템과 실행 파일 포멧 선택

cramfs(Compressed ROM File System)

롬 기반의 임베디드 시스템에 사용되는 읽기 전용의 압축 파일 시스템

내용 변경이 불가능

실행 파일 포멧 : ELF(Executable and

Linking Format) 하나만을 지원하는 것이 일반적임