KOSR 공개세미나 - 임베디드리눅스 - 김도집 2006.2.18
본강좌의목표 임베디드리눅스입문하는분 맛뵈기를보여드립니다. 리눅스를설치하긴부담스러운분 리눅스설치하지않아도됩니다. 임베디드하드웨어를구하기어려운분 비싼하드웨어사지않아도됩니다. 2
1. 리눅스이해및 개발환경구성
리눅스란? UNIX 계열의운영체제 오픈소스 다양한아키텍처지원 자유 (Free) 지만, 공짜 (Free) 는아니다. FSF (Free Software Foundation) GNU (Gnu is Not Unix) GPL v1, v2, v3, LGPL, BSDL 4
Unix 의역사 Before UNIX Multics: 1965, AT&T (Bell Lab), General Electronic, MIT Epoch BSD 1969, Ken Thompson, Space Travel on PDP-7 Dennis Ritche, Joseph Ossanna, Ray Tomlinson (BBN) s5fs, ed, shell (Bourn shell의조상 ) 1973년 The UNIX Time Sharing System in CACM Billy Joy, Chuch Haley ( 대학원생??) ex, csh, paging based virtual memory system, TCP/IP, ffs, socket 1993년 4.4BSD (final version, 이후 BSDI 회사 ) AT&T System V Version 1,2,,7, System III, System V, SVR4.2/ESMP region based virtual memory, IPC, remote file sharing, STREAM, 5
Unix 의역사 Commercial UNIX XENIX (MS, SCO), SCO UNIX (SCO), AIX (IBM, Journaling FS), HP-UX (HP), ULTRIX (DEC, 최초의 MP), OSF/1 (Digital),. SunOS (Sun Microsystems, VFS, NFS), Solaris, Unixware (Novell) Mach 최초의 micro-kernel chorus, Exo-kernel, SPIN, L4,. http://ssrnet.snu.ac.kr/~choijm/current_os.html standard Linux SVID(System V Interface Definition), POSIX (IEEE), X/OPEN (Inc.) UI (SUN, AT&T : Solaris), OSF (OSF/1) 1991, Linus Torvalds, Performance-Oriented, based on MINIX Philosophy of COPYLEFT 6
리눅스입문 리눅스를이용하여개발하고자한다면? 윈도우의도스창과친해야한다. 리눅스와친해져야한다. 리눅스를설치해서사용해본다. 쉘 (shell) 환경및사용에익숙해진다. 리눅스의부팅및구조에익숙해진다. 7
임베디드시스템 독립적인내장형시스템 MCU가내장된시스템 하나이상의독립된기능을수행 실행이되면정해진기능을수행 { 세탁기, 냉장고, TV, 휴대폰 } vs {PC} 8
개발환경 (H/W) ROM 라이터 / 이레이저 Oscilloscope/Logic analizer 툴체인및개발환경을제공한다. 개발호스트 USB/ 이더넷 디버거 상용디버거의경우소스코드레벨의실시간디버깅을제공한다. 타겟시스템 시리얼 이더넷 JTAG 시스템 F/W 및리눅스를올리고자하는시스템이다. 9
개발환경 (S/W) 툴체인 컴파일러, 라이브러리, bin-utils IDE Eclipse Editor vi / emacs / UltraEdit / SourceInsight 디버깅소프트웨어 상용디버깅소프트웨어 GDB/Insight Terminals minicom / Token2(plus) / Teraterm / Hyperterminal Skyeye(armulator) / Cygwin / etc 10
툴체인 임베디드시스템의개발의경우 컴파일을하는시스템 ( 호스트 ) 과 실행을하는시스템 ( 타겟시스템 ) 이다르다 크로스컴파일러등의개발도구필요 툴체인 (toolchains) 타겟시스템을위한컴파일관련도구를제공한다. 컴파일러, 라이브러리, bin-utils 등 11
Cygwin 윈도우에서리눅스와유사한환경을제공 리눅스 API를위한에뮬레이션제공 (cygwin1.dll) 리눅스에서사용하는다양한프로그램제공 http://www.cygwin.com 에서 Install or update now! 를통해설치및업데이트가능. 12
클릭 13
인터넷에서직접다운로드해서설치하거나설치는하지않고다운로드만도가능하다. 이후다운로드받은것으로설치도가능한다. 루트디렉토리가될경로를결정한다. 이곳이바로 cygwin 과관련된프로그램이위치하게된다. 14
다운로드받은것을임시로저장할경로를지정한다. 인터넷연결방식을결정한다. 어디에서다운로드받을지를선택한다. 15
설치할패키지를선택한다. 바이너리뿐만소스도설치할수있다. 설치뿐만아니라업데이트시에도동일한환경을제공한다. 설치가끝나면바탕화면에 Cygwin 이라는아이콘이생기며이를클릭하면 cygwin 의 shell 창이나타난다 ( 윈도우의 cmd 창과비슷하다 ) cygwin 실행화면 16
한글이깨지는경우.bashrc 파일에서 ls='ls -hf --color=tty' 를 alias ls='ls -hf --color=tty --show-control-char' 로수정한다..inputrc 파일에서다음의주석을풀어준다. set meta-flag on set convert-meta off set input-meta on set output-meta on 17
프롬프트가너무길다 profile 에서 PS1 의값을다음과같이변경한다. PS1=' u W] $ ' 18
Cygwin binutils gcc make 19
툴체인 (1/2) 윈도우에서툴체인을사용하는경우 Cygwin을이용 윈도우용툴체인을사용 toolchains for windows http://www.gnuarm.org 20
21
설치경로중 Program Files 와같이공백이있는경우사용시에문제가될수있다. 따라서 C: GNUARM 과같은경로에설치한다. 22
23
24
Cygwin 을실행하고그창에서 arm-elf-gcc v 를실행하면아래와같은화면을볼수있다. 25
arm-elf-gcc arm-elf-gcc -Wall -O2 -o target source arm-elf-gcc -Wall -O2 -c source arm-elf-gcc -Wall -O -g -o target source arm-elf-strip file arm-elf-objdump -S file > file.dump arm-elf-objdump -x file > grep NEEDED 26
툴체인 (2/2) 리눅스에서툴체인사용하는경우 소스를가져와서직접빌드 스크립트를이용하여빌드 ( 권장 ) 바이너리를이용 ( 권장 ) 스크립트를이용하여빌드하는경우 http://www.uclibc.org http://kegel.com/crosstool/ http://www.scratchbox.org/ 27
Terminals iputty http://kldp.net/projects/iputty/ Xshell http://www.netsarang.com TeraTerm http://www.tucows.com/preview/195282 Token2 (plus) http://www.choung.net/token2/ 28
Simulator - Skyeye Skyeye skyeye는리눅스와윈도우에서시뮬레이션환경을제공한다. skyeye는 GDB기반의 armulator이다. http://www.skyeye.org 29
Simulator - Skyeye CPU ARM7TDMI, ARM720T, StrongARM, XScale APPLICATION CPU Atmel AT91/X40,Cirrus CIRRUS LOGIC EP7312,Intel SA1100/SA1110, Intel PXA 25x MEMORY RAM, ROM, Flash Peripheral Timer, UART, ne2k network chip,etc. 30
Simulator - Skyeye 지원하는 OS uc/osii-2.x with network support uclinux based on Linux2.4.x with network support ARM Linux 2.4.x lwip on uc/osii uc/osii, uclinux,arm Linux 상에서동작하는소프트웨어 31
http://gro.clinux.org/projects/skyeye/ 최근파일릴리즈중아무거나다운로드를클릭한다. skyeye on Windows 중 skyeye0.9.5.win32.rar를다운받아설치한다. 32
윈도우층창에서 skyeye.bat 를실행한다. ( 단, skyeye0.9.5.win32 의경우자체적으로 cygwin1.dll 을포함하고있으므로앞서설치한 cygwin1.dll 과충돌하지않도록해야한다.) Linux 커널파일을선택하고 Run 을클릭한다. 프롬프트에서 run 을입력한다. 33
Skyeye 를이용해 uclinux 를실행한화면이다. 34
skyeye.win32 demo-uclinux3 35
.skyinit skyeye.conf 36
2. 시스템 F/W 이해및 프로그래밍
Boot sequence 1 Power On Reset 3 Bootloader 를 RAM 으로 relocation 한후 RAM 으로점프한다. CPU RAM NOR FLASH reset handler reset: 2 b reset 0x0000 0000 번지의 reset vector 실행 38
Nand boot sequence 1 Power On Reset 2 0x0000 0000 번지의 reset vector 실행 4 CPU SRAM 의코드는 NAND 플래시에서 OS Loader 를읽어서 RAM 으로가져온다. SRAM Bootcode 3 RAM NAND FLASH Block0 Bootcode 가 NAND 플래시의 Block 0 를 SRAM 으로읽어온다 39
부트로더 임베디드시스템에서는시스템을초기화하고 OS를 loading를해줘야함 또한개발의편의를위하여모니터프로그램이필요 이러한기능을제공하는것이부트로더임 u-boot은 ARM, PowerPC, MIPS 등을지원하는부트로더 40
u-boot cpu/arm720t/start.s board/ep7312/lowlevel_init.s lib_arm/board.c drivers/* common/main.c common/cmd_* 41
start.s ARM 은 0x0 번지에 vector table 이위치해야한다. 최초전원이인가되면 reset 이되면 0x0 번지가실행된다. ARM 은여러개의프로세서동작모드가있는데 reset 이걸리면기본적으로 SVC32 모드가된다. 42
start.s 기본적으로 IRQ 를모두막는다. MMU 및 cache 를사용하지않도록한다. 43
start.s board/ep7312/lowlevel_init.s 의 lowlevel_init 을점프한다. 44
lowlevel_init.s CPU 클럭과 SDRAM 메모리컨트롤러를설정한다. 45
start.s RAM 으로 u-boot 을재배치한다. 왜일까? 46
start.s 47
board.c 48
board.c main_loop() 함수는 common/main.c 에정의되어있다. main.c 에서는무한루프를돌면서프롬프트로입력되는값을해석해서해당하는 command 를실행하는역할을한다. 49
u-boot http://sourceforge.net/projects/u-boot 위사이트에서 u-boot-1.1.4 소스를다운받는다. tar xvjf u-boot-1.1.4.tar.bz2 50
configs/ep7312.h 에서다음부분수정 #define CONFIG_DRIVER_CS8900 1 을 #define CONFIG_DRIVER_CS8900 0 로수정 #define CONFIG_COMMANDS 을 (CONFIG_CMD_DFL CFG_CMD_JFFS2) #define CONFIG_COMMANDS (CONFIG_CMD_DFL) 로수정 51
GNUARM.org 의 arm-elf-gcc 에서는다음이옵션을지원하지않는다. -mshort-load-byte -macps-32 -msoft-float u-boot 의 cpu/arm720t/config.mk 에서위옵션들을제거한다. 52
make ep7312_config make all 컴파일이끝나면 u-boot.bin 파일과 u- boot 파일이생성. u-boot.bin 파일사용할것임. 53
skyeye가있는디렉토리에 ep7312 새디렉토리를만든다. skyeye.conf 라는파일을아래내용으로만든다. 54
u-boot.bin 파일을 ep7312 디렉토리아래에놓는다. 55
bin skyinsight -nw --cd=ep7312 (skyeye) target sim (skyeye) run 56
57
58
3. 리눅스 S/W 이해및 프로그래밍
Linux 리눅스부팅을위해필요한것 리눅스커널이미지 리눅스 root 파일시스템이미지 60
윈도우층창에서 skyeye.bat 를실행한다. ( 단, skyeye0.9.5.win32 의경우자체적으로 cygwin1.dll 을포함하고있으므로앞서설치한 cygwin1.dll 과충돌하지않도록해야한다.) Linux 커널파일을선택하고 Run 을클릭한다. 프롬프트에서 run 을입력한다. 61
Skyeye 를이용해 uclinux 를실행한화면이다. 62
skyeye.win32 demo-uclinux3 63
.skyinit skyeye.conf 64
리눅스커널 2.4.x 컴파일 make menuconfig make dep make clean make zimage 리눅스커널 2.6.x 컴파일 make menuconfig make zimage 65
커널을컴파일결과 arch/arm/boot/zimage gzip 형태로압축된것으로이미지자체에압축해제및 relocation 코드가포함되어있다. 66
루트파일시스템 루트파일시스템은메모리에올라감. 그래서램디스크라고도함. 기존에만들어진이미지를수정해서사용 gzip -d rootfs.gz mount -o loop rootfs tmp/ tmp/ 아래의내용을수정함 umount -o loop tmp/ gzip -9 rootfs 67
감사합니다.