380 likes | 794 Views
임베디드 리눅스 개발. 타겟 머신의 선택 임베디드 리눅스의 크기 소프트웨어 개발 툴의 선택 부팅 리눅스 커널 버전의 선택 쉘의 선택 GUI 의 선택 파일 시스템과 실행 파일 포맷의 선택. 타겟 머신의 선택. 임베디드 시스템의 하드웨어 선택은 임베디드 리눅스 개발의 첫번째 선택 사항 하드웨어 선택 시 고려 사항 개발 비용 개발 기간 개발 가능성 주변 장치 : 기 개발된 디바이스 드라이버가 존재하는것을 선택하는것이 유리. 임베디드 리눅스의 크기. 일반적으로 커널의 크기 커널 구성 요소
E N D
임베디드 리눅스 개발 타겟 머신의 선택 임베디드 리눅스의 크기 소프트웨어 개발 툴의 선택 부팅 리눅스 커널 버전의 선택 쉘의 선택 GUI의 선택 파일 시스템과 실행 파일 포맷의 선택
타겟 머신의 선택 • 임베디드 시스템의 하드웨어 선택은 임베디드 리눅스 개발의 첫번째 선택 사항 • 하드웨어 선택 시 고려 사항 • 개발 비용 • 개발 기간 • 개발 가능성 • 주변 장치 : 기 개발된 디바이스 드라이버가 존재하는것을 선택하는것이 유리
임베디드 리눅스의 크기 • 일반적으로 커널의 크기 • 커널 구성 요소 • 이를 구현한 프로그램의 크기 • 일반적인 리눅스 커널의 구성 요소 • 프로세스 관리 • 메모리 관리 • 프로세스간 통신 • 파일 시스템 관리 • 네트워크 관리 • 디바이스 드라이버
최소의 임베디드 리눅스 • 임베디드 리눅스 커널 크기의 최소화 • 최소의 프로세스 관리 • 목표 시스템에 맞는 프로세스 관리부분만 선택 • 필요한 스케줄러만 선택 • 메모리 관리 • 적절한 메모리 관리 정책만 구현 • 프로세스간 통신 • 사용될 통신 방법만 구현 • 파일 시스템 관리 • 사용될 파일시스템과 최적의 호환성을 제공하는 파일 시스템만 구현 • 네트워크 관리 • 필요한 통신 프로토콜만 구현 • 디바이스 드라이버 • 필요한 경우에만 커널에 올릴 수 있게 구성
소프트웨어 개발 툴의 선택 • 임베디드 시스템 개발 툴 : 호스트 시스템 위에서 사용할 수 있는 크로스 개발 툴(cross-development tool)을 사용 • 개발 툴의 구성 : 타겟 프로세서를 위한 • 크로스컴파일러(cross-compiler) • 어셈블러(assembler) • 링커(linker) • 아카이버(archiver) • 목적 파일생성 및 관리 툴
User Program & Application Library User Level Kernel Level System Call Interface Memory Management Virtual File System Process Management Buffer Char Block Device Driver Kernel Level Hardware Control H/W Level Hardware Control Linux 커널 구조
Linux 커널 구조(2) • 커널(kernel) 이란 ? • 메모리에 상주하여 시스템 구동에 필요한 환경을 만들고 관리하는 소프트웨어로써 H/W와 인터럽트 등을 통해 통신하고, 사용자 Application과 시스템 호출 인터페이스 등을 통해 통신하는 소프트웨어 • 작은 의미의 OS 자체 • 시스템 내의 모든 리소스(H/W, S/W) 관리 • 응용 프로그램에게 서비스 제공 • Process Management • 태스크 생성, 실행, 상태전이, 스케줄링, 시그널 처리, 프로세스간 통신, 모듈 등의 서비스를 관리 및 제공 • Memory Management • 가상 메모리, 주소변환, 페이지 부재 결함 처리 • Virtual File System • 파일 생성, 접근 제어, inode 관리, 디렉터리 관리, 버퍼 캐쉬관리 등 • Device Driver • 주변장치를 구동하는 드라이버로 구성
Top Dir ipc mm lib kernel init script fs net driver include Document arch ext2 ipv4 char asm-ppc kernel ppc … … … … … … jffs2 ipv6 block asm-arm mm i386 cramfs x25 usb linux boot arm Linux 커널 소스구조
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입력 • 위와 같은 텍스트 메뉴 방식의 설정상자가 나타남 • 터미널 창에서 메뉴를 바로 지정하여 편리 -> 일반적으로 사용됨
.config Makefile에서 이용 #make menuconfig 메뉴설정 설정저장 config.in을 읽어서 메뉴로 표현 같은 내용을 두 가지 형태로 저장 include/linux/autoconf.h C 파일에서 이용 커널 컴파일 옵션 설정(2) • 커널 컴파일 옵션 메뉴를 정의하는 언어 • 소스코드 : arch/ppc/config.in 이 있으며 , 하부 디렉터리에 각 디렉터리에 대해 해당하는 Config.in 파일이 존재 • Documentation/kbuild/config-language.txt • menuconfig, xconfig 등을 실행하면 config.in 을 읽어서 텍스트 메뉴로 표현 • 커널 컴파일 옵션 설정 원리
커널 컴파일 • #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을 이용하여 부팅할 때 사용하는 파일임
#make mrproper 커널 컴파일 설정 및 저장 커널 컴파일 설정변경 커널 컴파일 설정변경 #make menuconfig #make dep .depend 파일 생성 소스코드 수정 또는 파일이동 소스코드 수정 또는 파일이동 #make zImage #make zImage -> make vmlinux.ppcboot 커널 컴파일(2)
vmlinux 실제 커널의 raw binary 이미지 파일 ELF Header 실제 커널의 raw binary 압축파일 Program Header head_8xx.o .text main.o 일부 vmlinux.gz entry.o objcopy를 이용하여 실제 커널의 raw binary 이미지 생성 gzip을 이용하여 압축 trap.o …. …. .data …. .bss …. Section Header 커널 이미지 구조
부트 로더(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용 커널 실제 커널의 raw binary 압축파일 ppcboot 헤더 vmlinux.gz vmlinux.gz 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
vmlinux 실제 커널의 raw binary 이미지 파일 ELF Header 실제 커널의 raw binary 압축파일 ppcboot용 커널 Program Header head_8xx.o .text main.o 일부 ppcboot 헤더 vmlinux.gz entry.o vmlinux.gz objcopy를 이용하여 실제 커널의 raw binary 이미지 생성 gzip을 이용하여 압축 mkimage trap.o …. …. .data …. .bss LETOK-850의 경우 PPC계열이므로 위의 경우에 해당됨 …. Section Header ppcboot용 커널 구조
Target RAM RAM 5. 분기 및 커널압축 해제 Flash memory Linux 커널 1.TFTP request 4.커널분기 Host ppcboot vmlinuz.gz 6. NFS Root FS 마운트 3.압축커널 다운로드 2.TFTP reply (압축커널만) Host Hard Disk (File System) ppcboot 부팅–TFTP/NFS
부팅 • 부트로더(boot loader) : 시스템의 전원을 켰을 때 자장 먼저 실행되는 부분 • 부트로더의 역할 • 램을 사용할 수 있도록 초기화 • 루트 파일시스템을 준비 • 자신을 램에 복사한 후 계속 실행됨 • 하드웨어의 초기화 • 커널을 램에 적재한 후 실행권 이양 • 호스트 시스템과의 통신 수단 제공
부팅 • 부트로더의 위치 • 일반적으로 시스템의 물리 주소 번지 0부터 위치 • 롬, 플래쉬롬, SRAM 등 정적인 메모리에 위치 • 부트로더의 기능 • 메모리 초기화 • 하드웨어 초기화 • 직렬포트의 초기화 • 네트워크 초기화 • 프로세서 속도, 인터럽트의 초기화 • 커널과 램디스크 적재 : 커널과 램디스크를 램에 적재하여 실행 • 정적 메모리에 쓰는 기능 • 사용자 인터페이스 기능
부트로더 • 기능에 맞게 직접 작성 • 기존에 존재하는 부트로더를 이용 • 기존에 개발된 부트로더가 그대로 사용 불가능할 때 • 소스코드가 공개되어있고 • 라이선스 획득이 가능한 것을 선택 • 필요한 수정을 가하여 새로운 브트로더를 작성 • 많이 사용되는 것 • LinuxBIOS(http://www.acl.lanl.gov/linuxbios/) • Red Hat Inc.의 RedBoot • Blob(http://www.lart.tudelft.nl)
Blob 파일 설명 • start.S : 가장 먼저 실행되는 파일 • 인터럽트 disable • CPU 클럭 설정 • 메모리 설정 • 직렬포트 설정 • Stack Point 설정 • c_main 루틴으로 점프
Blob 파일 설명 • main.c : 모든 함수는 이 곳에서 관리하고 해당 함수는 각 해당 c 파일의 함수를 호출하여 수행
리눅스 커널 버전의 선택 • 커널 버전 • 역사 : 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) 하나만을 지원하는 것이 일반적임