임베디드 리눅스 개발
DESCRIPTION
임베디드 리눅스 개발. 타겟 머신의 선택 임베디드 리눅스의 크기 소프트웨어 개발 툴의 선택 부팅 리눅스 커널 버전의 선택 쉘의 선택 GUI 의 선택 파일 시스템과 실행 파일 포맷의 선택. 타겟 머신의 선택. 임베디드 시스템의 하드웨어 선택은 임베디드 리눅스 개발의 첫번째 선택 사항 하드웨어 선택 시 고려 사항 개발 비용 개발 기간 개발 가능성 주변 장치 : 기 개발된 디바이스 드라이버가 존재하는것을 선택하는것이 유리. 임베디드 리눅스의 크기. 일반적으로 커널의 크기 커널 구성 요소 - PowerPoint PPT PresentationTRANSCRIPT
임베디드 리눅스 개발
타겟 머신의 선택 임베디드 리눅스의 크기 소프트웨어 개발 툴의 선택 부팅 리눅스 커널 버전의 선택 쉘의 선택 GUI 의 선택 파일 시스템과 실행 파일 포맷의 선택
타겟 머신의 선택
임베디드 시스템의 하드웨어 선택은 임베디드 리눅스 개발의 첫번째 선택 사항
하드웨어 선택 시 고려 사항 개발 비용 개발 기간 개발 가능성 주변 장치 : 기 개발된 디바이스 드라이버가
존재하는것을 선택하는것이 유리
임베디드 리눅스의 크기
일반적으로 커널의 크기 커널 구성 요소 이를 구현한 프로그램의 크기
일반적인 리눅스 커널의 구성 요소 프로세스 관리 메모리 관리 프로세스간 통신 파일 시스템 관리 네트워크 관리 디바이스 드라이버
최소의 임베디드 리눅스
임베디드 리눅스 커널 크기의 최소화 최소의 프로세스 관리
목표 시스템에 맞는 프로세스 관리부분만 선택필요한 스케줄러만 선택
메모리 관리적절한 메모리 관리 정책만 구현
프로세스간 통신사용될 통신 방법만 구현
파일 시스템 관리사용될 파일시스템과 최적의 호환성을 제공하는 파일 시스템만 구현
네트워크 관리필요한 통신 프로토콜만 구현
디바이스 드라이버필요한 경우에만 커널에 올릴 수 있게 구성
소프트웨어 개발 툴의 선택
임베디드 시스템 개발 툴 : 호스트 시스템 위에서 사용할 수 있는 크로스 개발 툴 (cross-development tool) 을 사용
개발 툴의 구성 : 타겟 프로세서를 위한 크로스컴파일러 (cross-compiler) 어셈블러 (assembler) 링커 (linker) 아카이버 (archiver) 목적 파일생성 및 관리 툴
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
Linux 커널 구조 (2) 커널 (kernel) 이란 ?
메모리에 상주하여 시스템 구동에 필요한 환경을 만들고 관리하는 소프트웨어로써 H/W 와 인터럽트 등을 통해 통신하고 , 사용자 Application과 시스템 호출 인터페이스 등을 통해 통신하는 소프트웨어
작은 의미의 OS 자체 시스템 내의 모든 리소스 (H/W, S/W) 관리 응용 프로그램에게 서비스 제공
Process Management 태스크 생성 , 실행 , 상태전이 , 스케줄링 , 시그널 처리 , 프로세스간 통신 ,
모듈 등의 서비스를 관리 및 제공 Memory Management
가상 메모리 , 주소변환 , 페이지 부재 결함 처리 Virtual File System
파일 생성 , 접근 제어 , inode 관리 , 디렉터리 관리 , 버퍼 캐쉬관리 등 Device Driver
주변장치를 구동하는 드라이버로 구성
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
… … … … ……
Linux 커널 소스 구조 (2) init
커널의 초기화 부분 -> 커널의 메인 시작 함수가 구현된 디렉터리 kernel
Task 관리자가 구현된 디렉터리 Task 생성 , 소멸 , 프로그램의 실행 , 스케줄링 , 시그널 처리 , 모듈관련 , 커널 심볼 등이
구현 arch
H/W 에 종속적인 부분들이 구현 CPU 타입에 따라 하위 디렉터리로 다시 구분 /arch/cpu-type/ 에는 다시 5 개의 하위 디렉터리로 구성
boot – 시스템 초기화 시 이용하는 부트스트랩 코드가 구현 커널 소스 컴파일 시 결과물인 vmlinuz 파일도 여기에 생성
Kernel – Task 관리자중에서 Context switch 또는 thread 관리 같은 하드웨어 종속 적인 부분이 구현
mm- 메모리 관리자 중에서 페이지 부재 결함 처리와 같은 하드웨어 종속적인 부분 이 구현
lib- 커널이 사용하는 라이브러리 함수가 구현
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 등으로 구성
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 하위 디렉터리에 구현
Linux 커널 소스 구조 (5) Document
Linux 커널 및 명령어들에 대한 자세한 문서 파일들이 존재 lib
커널 라이브러리 한수들이 구현 module
컴파일 된 모듈 함수들이 존재 scripts
커널 구성 및 컴파일 할 때 이용되는 스크립터들이 존재
커널 컴파일 옵션 설정 커널 컴파일 시 필요한 옵션 설정 방법
가장 먼저 Linux 소스가 있는 디렉터리로 이동 ( 예 :/kernel/src/linux-2.4.4/) #make menuconfig 입력
위와 같은 텍스트 메뉴 방식의 설정상자가 나타남 터미널 창에서 메뉴를 바로 지정하여 편리 -> 일반적으로 사용됨
커널 컴파일 옵션 설정 (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 파일에서 이용
커널 컴파일 #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 을 이용하여 부팅할 때
사용하는 파일임
커널 컴파일 (2)
#make mrproper
#make menuconfig
#make dep
#make zImage #make zImage -> make vmlinux.ppcboot
커널 컴파일 설정변경
커널 컴파일 설정변경
소스코드 수정 또는 파일이동
소스코드 수정 또는 파일이동
커널 컴파일 설정 및 저장
.depend 파일 생성
커널 이미지 구조
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 을 이용하여
압축
부트 로더 (boot loader) 시스템의 하드웨어를 초기화하고 운영체제의 커널을 메모리에 올려 실행시키는
시스템 프로그램 JTAG/BDM -> 플래시 메모리에 부트 로더를 굽는 유틸리티 LETOK-850 에서는 BDM 을 이용하여 부트 로더를 굽게 됨
부트 로더의 위치 일반적으로 시스템 메모리의 물리 주소 0 번지부터 위치 롬 , 플래쉬롬 , SRAM 등 정적인 메모리에 위치
부트 로더의 기능 메모리 초기화 하드웨어 초기화
직렬포트의 초기화 네트워크 초기화 프로세서 속도 , 인터럽트의 초기화
커널과 램 디스크 적재 : 커널과 램 디스크를 램에 적재하여 실행 정적 메모리에 쓰는 기능 사용자 인터페이스 기능
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 유틸리티를 이용하여 작성
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 용커널
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 계열이므로위의 경우에 해당됨
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)
부팅
부트로더 (boot loader) : 시스템의 전원을 켰을 때 자장 먼저 실행되는 부분
부트로더의 역할 램을 사용할 수 있도록 초기화 루트 파일시스템을 준비 자신을 램에 복사한 후 계속 실행됨 하드웨어의 초기화 커널을 램에 적재한 후 실행권 이양 호스트 시스템과의 통신 수단 제공
부팅부트로더의 위치
일반적으로 시스템의 물리 주소 번지 0 부터 위치 롬 , 플래쉬롬 , SRAM 등 정적인 메모리에 위치
부트로더의 기능 메모리 초기화 하드웨어 초기화
직렬포트의 초기화네트워크 초기화프로세서 속도 , 인터럽트의 초기화
커널과 램디스크 적재 : 커널과 램디스크를 램에 적재하여 실행 정적 메모리에 쓰는 기능 사용자 인터페이스 기능
부트로더
기능에 맞게 직접 작성기존에 존재하는 부트로더를 이용기존에 개발된 부트로더가 그대로 사용 불가능할 때
소스코드가 공개되어있고 라이선스 획득이 가능한 것을 선택 필요한 수정을 가하여 새로운 브트로더를 작성 많이 사용되는 것
LinuxBIOS(http://www.acl.lanl.gov/linuxbios/)Red Hat Inc. 의 RedBootBlob(http://www.lart.tudelft.nl)
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
Blob 파일 설명
start.S : 가장 먼저 실행되는 파일 인터럽트 disable CPU 클럭 설정 메모리 설정 직렬포트 설정 Stack Point 설정 c_main 루틴으로 점프
Blob 파일 설명main.c : 모든 함수는 이 곳에서 관리하고
해당 함수는 각 해당 c 파일의 함수를 호출하여 수행
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
리눅스 커널 버전의 선택커널 버전
역사 : http://www.linux.org/dist/kernel.html 버전 숫자 : X.Y.ZZ
X : 커널의 버전Y : 릴리즈 번호 , 홀수 -> 개발중 , 짝수 ->안정된 버전ZZ : 모디피케이션 , 사소한 변화를 의미
최신 버전새로운 다양한 기능이 이미 추가되어 있음크기가 매우 크다는 단점이 있음
커널 버전의 선택 임베디드 시스템의 크기를 고려 필요한 기능을 고려 확장성을 고려
쉘의 선택
두가지 계열의 쉘 프로그램이 존재 본 (Bourne) 쉘 C 쉘
임베디드 시스템과의 대화에 필요한 초소한의 기능을 선택
사용의 편리성을 고려이러한 기능을 포함하는 가장 작은 크기의 쉘
프로그램을 선택
GUI 의 선택 (1)
터치 스크린 위에서 아이콘과 가상 키보드 등을 이용하여 대화하는 시스템 : GUI 를 위한 윈도우 시스템과 윈도우 메니저가 필요
리눅스의 일반적인 윈도우 시스템과 메니저 X-Windows : twm, fvwm, olvwm, mwm, WindowMaker,
AfterStep, NeXTSTEP 등 소스코드가 공개되어 있음 무료 크기가 매우 큼 실행 시 많은 시스템 자원을 사용 임베디드 시스템에는 부적합
GUI 의 선택 (2)
대안들 Mini X-Windows
소스코드가 공개되어 있음 무료 여전히 크기가 크고 시스템 자원을 많이 사용
Qt TrollTech 사에서 개발 소스코드가 공개되어 있음 GPL 버전의 무료 사용이 가능 여러 가지 운영체제를 위한 각각의 라이브러리가 존재 한번의 개발로 여러 운영체제 위에서 사용 가능
GUI 의 선택 (3)
대안들 Qt/Embedded
Qt 를 경량화 하여 임베디드 시스템에 적합하게 개발됨모듈러하고 스키일러블 함 : 크기나 기능을 재구성 할
수 있음데스크탑용 Qt 위에서 프로그램 개발 -> 다시 컴파일
하여 임베디드 시스템에서 사용 가능
GUI 의 선택 (4)
@win 국내의 아델리눅스에서 개발 다국어 지원이 가능 적은 디스크와 메모리를 사용 안정적이고 빠른 그래픽 환경을 제공 APL 버전의 무료 사용이 가능 데스크탑과 임베디드 시스템에서 모두 사용 가능 향후 소스코드가 공개될 것임
GUI 의 선택 (5)
대안들 Microwindows
소스코드가 공개되어 있음 무료로 사용 가능 Xlib 및 Win32 와 호환됨 현재 개발 중 ( 버전 0.89pre7)
파일 시스템과 실행 파일 포멧 선택
현재 리눅스에서 지원되는 파일 포멧 : 10 여 종임베디드 시스템을 위한 파일 시스템
2~3 종이면 충분 EXT2 : 리눅스 전용 , 임베디드 시스템에서도
일반적으로 지원 XIP(Execute-in-Place)
롬이나 플래쉬롬에 있는 프로그램을 램에 적재하지 않고 그곳에서 바로 실행
램에 대한 메모리 요구량을 줄여 줌많은 응용프로그램이 동시에 실행 가능
파일 시스템과 실행 파일 포멧 선택
cramfs(Compressed ROM File System)
롬 기반의 임베디드 시스템에 사용되는 읽기 전용의 압축 파일 시스템
내용 변경이 불가능
실행 파일 포멧 : ELF(Executable and
Linking Format) 하나만을 지원하는 것이 일반적임