embedded linux 강좌

102
1 Embedded Linux 강좌 Embedded Linux 강좌 작성자 : 박 길성

Upload: others

Post on 02-Nov-2021

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Embedded Linux 강좌

1

Embedded Linux 강좌

EmbeddedLinux 강좌

작성자 : 박 길성

Page 2: Embedded Linux 강좌

2

Embedded Linux 강좌

목 차1. 개발환경구축1) ToolChain 2) JTAG3) Bootloader 4) minicom 설정 및 실행5) Kernel Compile 6) Root File System 만들기7) Bootp 와 Tftp2. Xinetd 3. Bootp4. Tftp 5. NFS (Network File System) 설정6. Goahead webserver 설치7. Busybox컴파일 하기8. System Cal l 추가하기9. BOA 웹서버 설치 10. N A T 구축11.Device Driver 12. Application 실행

Page 3: Embedded Linux 강좌

3

Embedded Linux 강좌

1. X-Hyper255A 개발환경구축

하드웨어 검증

호스트(Host) set up : Linux 설치 점검

Backend

RS-232, Ethernet 설치, parallel(JTAG)

Host용 terminal 구동

Target terminal 구동

: monitor 프로그램(Minicom) 이용

JTAG 프로그램밍

Cross compiler 환경 구축

Boot loader

Page 4: Embedded Linux 강좌

4

Embedded Linux 강좌

Host 환경

Pentium급컴퓨터

Redhat 9.0 Serial port 및 Serial cross cableEthernet 카드및 cross cableJTAG용 parallel cableHost용 linux shell로는 bash를사용한다.Minicom : redhat 9.0에 기본적으로설치되어있다.Arm용 cross compiler : arm-linux

Page 5: Embedded Linux 강좌

5

Embedded Linux 강좌

Target board 환경

Target board에 JTAG, Serial, Ethernet과 power를 연결한다.

host PC에는 병렬 포트와 직렬포트에 연결한다.

병렬 포트는 JTAG을 통해서 Image파일을 loading할 때 사용한다.

(사용하는 프로그램은 Jflash-linux-pxa255)

직렬포트는 target board의 console로 사용된다.

터미널로는 Minicom이 사용된다.

Ethernet은프로그램 downloading할때사용된다

Page 6: Embedded Linux 강좌

6

Embedded Linux 강좌

Host와 Target의 연결

Host용 터미널 Minicom(타겟용 터미널)

Host

Serial cable

Ethernet cross cable

Backend

JTAG cable

Target

Page 7: Embedded Linux 강좌

7

Embedded Linux 강좌

1) ToolChain

의 미 : 각종 source을 Compile하고 Build하여 실행 Binary를 생성하는데 필요한 각종 Utility 및 Library의 모음이다.

타겟보드의 CPU에서 실행이 되는 실행파일과 라이브러리들을만들기 위해서 ToolChain을 설치해야한다.

GNU에서 제공하는 Tool-chain을 사용한다.

Toolchain은 BinUtils(objcopy,strips,objdump, nm,size, readelfe,ld,as등)와 컴파일러(gcc,g++) 그리고 라이브러리

(glibc)로 구성되어 있다.

Page 8: Embedded Linux 강좌

8

Embedded Linux 강좌

ToolChain 설치(1)

1. 제공된 CD를 마운트한다.# mount /mnt/cdrom

2. CD의 내용을 호스트 컴퓨터에 복사한다.# mkdir -p /root/XHYPER255A# cd /mnt/cdrom# cp -r * /root/XHYPER255A

3. ToolChain 디렉토리로 이동하여 압축된hybus-arm-linux-R.1.1.tar.gz를 /usr/local 디렉토리로복사하고 압축을 푼다.# cd /root/XHYPER255A/Toolchain# cp hybus-arm-linux-R1.1.tar.gz /usr/local# cd /usr/local# tar xvzf hybus-arm-linux-R.1.1tar.gz

Page 9: Embedded Linux 강좌

9

Embedded Linux 강좌

ToolChain 설치(2)

4. hybus-arm-linux-R1.1이란 디렉토리가 생성되고이 디렉토리 밑에 bin 이란 디렉토리에 cross complie에필요한 파일들이 있다. 이 파일들을 리눅스상의어떤 디렉토리에서도 실행이 될 수 있도록 PATH를잡아주는 작업을 해야한다.

/root 디렉토리의 .bash_profile에 PATH를 잡아주는 작업을해야한다.

# cd /root# vi .bash_profilePATH=$PATH:$HOME/bin::/usr/usr//local/hybuslocal/hybus--armarm--linuxlinux--R1.1/binR1.1/bin 추가

# source .bash_profile // 설정파일을 갱신# arm-linux >tap을 치면

arm-linux로 시작하는 명령들을 볼 수 있다

Page 10: Embedded Linux 강좌

10

Embedded Linux 강좌

ToolChain 설치(1)

5. Toolchain Test 예제 파일을 작성하여 x86용으로 컴파일 된 파일과ARM용으로 컴파일된 파일의 내용을 확인하기먼저 자신의 홈디렉토리에 test 디렉토리를 만든다.

# cd /root# mkdir test# cd test# vi hello.c#include <stdio.h>int main(){

printf(“Hello World₩n”);return 0;

}저장 한다.

Page 11: Embedded Linux 강좌

11

Embedded Linux 강좌

ToolChain 설치(4)

# gcc -o hello_i386 hello.c# file hello_i386

i386에서 실행이 되는 ELF 파일포맷으로 컴파일 된 것을확인 할 수 있다.

# arm-linux-gcc –o hello_arm hello.c

ARM에서 실행되는 ELF 형식으로 된 것을 확인 할 수 있다.

Page 12: Embedded Linux 강좌

12

Embedded Linux 강좌

2) JTAG

의 미 : JTAG을 사용하는 용도는 하드웨어 디버깅과 Bootloader를flash fusing 하기 위해서이다. 개발환경구축에 있어서 JTAG은 Bootloader를 fusing 하는 용도로 사용한다. Host PC의 parallel포트를 사용한다.

HostTarget

System BCBJtag Compliant

Device

FlashMemory

InstructionRegister

Baundary ScanRegister

TAP

Address

Data

Controller

TMS

TDI

TDO

TCK

Page 13: Embedded Linux 강좌

13

Embedded Linux 강좌

JTAG 설치

JTAG 소스 디렉토리로 이동하여 make를 실행하면 Jflash-XHYPE R255 란 바이너리 생성 된다.

# cd /root/XHYPER255A/Jflash-XHYPER255 # make clean# make

이렇게 하여 생성된 Jflash-XHYPER255를 이용하여 Bootloader를fusing 할 수 있다.Jflash-XHYPER255를 홈디렉토리 밑의 bin 디렉토리에 복사한다.

# cd /root# mkdir bin // path에 잡혀있는 디렉토리# cp XHYER255A/Jflash-XHYPER255/Jflash-XHYPER255 /root/bin

Page 14: Embedded Linux 강좌

14

Embedded Linux 강좌

3) Bootloader

의 미 : Boot Loader 프로그램은 Flash Memory상에 저장되어 전원의 공급과 함께자동으로 수행되는 프로그램이다. 일반적으로 Embedded System에서는 일반 PC와는 달리 CMOS와 같이 여러 가지 용도로 사용되는 BIOS가 쓰이지 않는다. 대신에 Bootloader가 이 기능을 대신한다. Bootloader는 H/W (MCU, SDRAM, FLASH,UART, GPIO)등을 초기화 하고 매뉴얼 부팅과 일반적으로 커널로의 부팅을 하기위한 옵션을 지원한다. Bootloader를 컴파일 하기 위해서는 Toolchain이 설치 되어있어야 한다.

<Bootloader 기능>Hardware 초기화CPU clock, Memory timing, interrup,Uart,GPIO등을 초기화

Linux Bootingkernel image를 SDRAM에 저장후에 kernel image의 주소로 점프하는 기능

Image downloadkernel image와 filesystem를 SDRAM에 download 하는 기능(ethernet을 통해서만 가능)

Flash 제어Flash write/erase 기능, Flash lock/Unlock 기능

Page 15: Embedded Linux 강좌

15

Embedded Linux 강좌

Bootloader Compile(1)

1. Bootloader 소스의 압축을 푼다.

# cd /root/XHYPER255A/Bootloader# tar xvzf Boot-XHYPER255.tar.gz# cd Boot-XHYPER255# make

2. src/x-boot255가 생성된다. 이 파일을 Jflash-XHYPER255를 이용하여 타겟보드로fusing 하면된다.

# Jflash-XHYPER255 x-boot255

Page 16: Embedded Linux 강좌

16

Embedded Linux 강좌

4) minicom 설정 및 실행

의 미 : 호스트에서 타겟보드를 모니터링 하는데 minicom을사용하고 serial 케이블로 호스트의 com1과 연결된다.

1. minicom 설정# minicom -sconfiguration 화면에서 serial port setup 으로 들어간다.A – serial Device : /dev/ttyS0 //com1을 디폴트로 사용한다.E – Bps/Par/Bits : 115200F – Hardware Flow Control : No

로 변경한 후에 Save setup as dfl 한다.

2. bootloader를 fusing 한 후에 minicom을 실행# minicomBootloader가 fusing이 됐다면 3초안에 타이핑을 하면

Bootloader Command를 입력받는 화면의로 진행이 된다.

XHYPER255A>

Page 17: Embedded Linux 강좌

17

Embedded Linux 강좌

5) Boot loader사용하기

Page 18: Embedded Linux 강좌

18

Embedded Linux 강좌

Boot loader 기능(1)

Boot Loader 프로그램은 개발자를 위하여 몇 가지 기본적인 기능을 제공하며, 이러한 기능은 다음과 같다.

메모리 영역에 대한 복사 기능

Ex) memcpy [ToAdderss FromAddress NumberOfBytes]

target> memcpy c0008000 00100000 00100000

메모리 영역에 대한 초기화 기능

Ex) memset [Adderss Value NumberOfBytes]

target> memset c0000000 0 ff

Page 19: Embedded Linux 강좌

19

Embedded Linux 강좌

Boot loader 기능(2)

TFTP(Trivial FTP)를 이용한 Image Downloading 기능

Ex) tftp [filename RAMAddress]target> tftp zImage c0008000

Flash 메모리에 대한 기록 기능

•Ex) flash [ToROMAdderss FromRAMAddress NumberOfBytes]

target> flash 00100000 c0000000 00100000

RAM 영역에 있는 Linux 커널 이미지 booting 기능

•Ex) boot [Adderss arg0 argc1]

target> boot c0008000 0 14

메모리 영역에 대한 Dump 기능

•Ex) dumpmem [startAdderss NumberOfBytes]

target> dumpmem a0000004 4

Page 20: Embedded Linux 강좌

20

Embedded Linux 강좌

BLOB사용하기flashtarget> flash kernel

download나 tftp로 sdram에 올려진 kernel과 ramdisk image를 재사용을위해 flash에 기록해 두기 위해 사용한다.

speedtarget> speed 115200

serial을 통한 terminal의 통신이나 serial로 download할 때 속도를 지정한다.

helptarget> help -- help명령은 위에서 설명한 기능들의 사용방법을 알려준다.

downloadtarget> download kernel

kernel을 SDRAM c0008000영역에 download 한다. 위와 같은 방법으로 ramdisk도 download 할 수 있으며 ramdisk는SDRAM영역 c0500000 영역에 download이 된다.

reloadtarget> reload kernel

flash 영역에 있는 kernel을 SDRAM c0008000 영역으로 loading한다. 위와 같은 방법으로 ramdisk도 SDRAMc0500000 영역으로 loading 한다.

boottarget> boot --- 위와같은명령을통해 sdram 영역에 있는 linux로 부팅할 수 있다.

Page 21: Embedded Linux 강좌

21

Embedded Linux 강좌

6) Kernel Compile

의 미 : 타겟보드에서 실행이될 커널을 만들기 위한 작업.

Linux Kernel : linux-2.4.18.tar.gz(일반적인 커널 버전 2.4.18)

ARM Patch : patch-2.4.18-rmk7.gz(ARM 패치 파일)

PXA255 Patch : diff-2.4.18-rmk-pxa1.gz(PXA255 패치 파일)

X-Hyper255A Patch : xhyper255-patch-01.gz(XHYPER255A보드용 패치 파일)

위의 4개의 파일을 이용하여 X-Hyper255A보드에 맞는 커널소스를만든다.

Page 22: Embedded Linux 강좌

22

Embedded Linux 강좌

Patch 하기

1. kernel의 압축 풀기 및 각종 Patch 하기

# cd /root/XHYPER255A/Kernel/Patch# tar xvzf linux-2.4.18.tar.gz# cd linux //압축을 해제하면 linux 디렉토리가 생긴다.# gzip –cd ../patch-2.4.18-rmk7.gz | patch –p1# gzip -cd ../ diff-2.4.18-rmk-pxa1.gz | patch –p1# gzip -cd ../xhyper255-patch-01.gz | patch –p1

-cd 옵션은 패치 파일을 보존하고 stdout으로 화면으로 진행상황을

보도록 하는 옵션이다.patch -p1 옵션은 현재 압축을 풀고 있는 디렉토리에 patch를 하라는 옵션이다.

# make menuconfig // kernel configuration .config 파일 생성# make dep // 의존성을 검사한다. .depend 파일 생성# make zImage // kernel image를 생성한다.

.system.map 파일 생성

오류 없이 compile 되면 arch/arm/boot 디렉토리에 zImage가 생성된다.

Page 23: Embedded Linux 강좌

23

Embedded Linux 강좌

PATCH 파일 만들기(1)

파일을 다운받아 사용하는 입장에서의 작업

기존에 다운 받은 hello.c 파일과 patch가 된 hello.patch.gz을 같은 디렉토리에서 위치시킨다.

그런후 아래의 명령으로 hello.c 파일을 patch 한다.

# gzip -cd hello.patch.gz | patch -p0

hello.c 파일이 patch가 된 것을 확인한다.

Patch 파일 배포자 입장에서의 작업

# vi hello.c

#include <stdio.h>

int main()

{

printf(“hello world₩n”);

return 0;

}

Page 24: Embedded Linux 강좌

24

Embedded Linux 강좌

PATCH 파일 만들기(2)

# cp hello.c hello_orig.chello.c 파일을 배포한 후에 내용을 변경해야 하는 경우가 생긴다면 우선 기존의 hello.c 파일을 다른 이름(hello_orig.c)으로 복사 한다.

# vi hello.c -hello.c 파일을 변경한다.

#include <stdio.h>

int main()

{

printf(“hello woman₩n”); // hello world 에서 hello woman으로 변경

return 0;

}

# diff -uNr hello_orig.c hello.c > hello.patch --두 파일의 바뀐 부분을 추려내는 작업을 한다.

# vi hello.patch -- hello.patch를 배포하기 위여 아래의 명령을 추가한다

# diff -uNr hello.c hello.c -- 제일 처음에 이부분을 추가한다.

# gzip hello.patch // 결과물로 hello.patch.gz 이 생성된다 (배포할 patch 파일 압축)

Page 25: Embedded Linux 강좌

25

Embedded Linux 강좌

Kernel Compile

2.4.18-rmk7-pxa1-xhyper255.tar.gz를 사용하여 커널을 컴파일하기

1. Patch를 한 커널이 있는 디렉토리로 이동한다.# cd /XHYPER255/Kernel/2.4.18-rmk7-pxa1-xhyper255

2. kernel configuration을 설정한다.# make menuconfig기본적인 설정이 되어있으니, 저장만 하고 빠져 나오면 된다.

3. 의존성 검사를 한다.# make dep

4. kernel image를 생성한다.# make zImage

오류 없이 compile 되면 arch/arm/boot 디렉토리에 zImage가 생성된다.

Page 26: Embedded Linux 강좌

26

Embedded Linux 강좌

7) Root File System 만들기

의 미 : 타겟보드의 flash에 fusing 될 root 파일 시스템을 만든다.Root 파일 시스템은 보통 리눅스의 디렉토리 구조와 흡사하다.

# cd /root/XHYPER255A/FileSystem/# ./r.sh //셀스크립트 파일을 실행시키면 rootfs.img 란 파일이 만들어진다.

Filesystem 디렉토리 밑의 root_xhyper255란 디렉토리를 mkfs.jffs2 라는유틸리티를 이용하여 Root 파일 시스템을 만들어내는 스크립트다.

#!/bin/shmkfs.jff2 -o rootfs.img -e 0x20000 -r root_xhyper255 -p -l

<스크립트 파일 내용>-o rootfs.img : 만들어질 root 파일 시스템 이름-e 0x20000 : -e는 erasable로 flashROM이 16M 인경우는 0x20000으로

32M 인경우는 0x40000 정도로 설정하면 된다.-r root_xhyper255 : root 파일 시스템의 대상이 될 디렉토리-p : pending -l : little endian

Page 27: Embedded Linux 강좌

27

Embedded Linux 강좌

8) Bootp 와 Tftp

의 미 : kernel 및 root 파일시스템을 타겟보드에 fusing을 하려면 Host에서타겟보드로 kernel과 root 파일시스템을 전송해야 한다.비교적 크기가 큰 root 파일시스템을 전송하기 위해서는 ethernet을사용하는 것이 시간적으로 유리할 것이다. 그러기 위해서는 호스트에서 타겟보드로 IP를 할당해주는bootp와호스트에서 타겟보드로 파일을 전송할 수 있는 tftp 설정이 필요하다.

Xinetd 란?리눅스 시스템이 Booting될때 적재되는 서비스 데몬들을 관장하는슈퍼 데몬이다.

Tftp란?TFTP(Trivial File Transfer Protocol)는 ftp와 같은 전송 프로토콜이며하위 프로토콕이므로 UDP/IP 프로토콜을 사용한다.

Bootp 란?Tcp/ip상에서 자동 부팅을 위한 최초의 표준으로 디스크 장치가 없는클라이언트를 구동하기 위한 프로토콜로 개발 되었다.

Page 28: Embedded Linux 강좌

28

Embedded Linux 강좌

Introduction

Bootp는 tcp/ip상에서 자동부팅을 위한 최초의 표준으로, 디스크 장치가 없는 클라이언트를 위한 프로토콜이며 udp와 tftp 프로토콜을 사용한다.

Host와 target 보드간 접속을 연결하고 각종 정보들을 가져오기 위한 준비 절차라고 할 수 있다. 나중에 tftp를 통해 데이터 전송이 이루어 진다.다음은 bootp가 어떻게 설정되고 통신하는 지를 알아 본다.

필요한 configuration file

inetd.conf, bootptab, hosts, services

Bootp 설정시 필요한 데몬

inetd, bootpd

Serial cable

Ethernet cross cableHost Target Board

Page 29: Embedded Linux 강좌

29

Embedded Linux 강좌

Bootp 설정

1. Bootp 요청 : Target board는 host에게 IP를 요구함IP요청 packet을 생성하여 호스트에 전송함.

2. Bootp 응답 : host는 타겟보드의 Ip를 전달한다.IP 요청 packet을 inetd가 수신한다.inetd는 bootpd에게 IP요청 packet을 넘긴다.IP 응답 packet을 bootpd는 bootptab을 참조하여 IP응답packet을 전달한다.

필요한 데몬들 해당 데몬에서 사용하는

configuration 파일

Target Board Host

Bootp요청services

hostsBootp응답

Xinetd Xinetd.conf

bootpd bootptab

Page 30: Embedded Linux 강좌

30

Embedded Linux 강좌

Linux에서 TCP/IP 통신

1. 모든 TCP/IP 통신의 시작은 inetd 슈퍼서버를 통해 관리된다.2. Bootp 요청 : 타겟보드는 host에게 IP를 요구함

3. Bootp 응답 : host는 타겟보드의 Ip를 전달한다.

Xinetd

bootpd

tftpd

telnetd

ftpd

Inetd은 TCP/IP를 통하여 통신을 하고자 할 때 이를 관리하는 데몬이다. 그래서 TCP/IP와 관련된 프로토콜은 항상 inetd로 부터 각각의 해당되는 TCP/IP 관련 데몬을 호출한다.

Page 31: Embedded Linux 강좌

31

Embedded Linux 강좌

1. 패킷 형식Number of Second : client가 bootstrap을 시도한 시간을 set Secondary server는 이 시간을 참고하

여 일정시간이 경과할 때까지 응답하지 않음

Client IP Address : client가 자기자신의 ip를 알면 넣고 모르면 0.0.0.0

Your IP Address : client ip주소가 0이면 server가 ip주소를 채움

Server IP Address : server에 의해 채워짐

Gateway IP Address : Proxy server를 사용할 경우 Proxy server의 라우터 IP Address를 보충

Client Hardware Address : client는 반드시 setting, ethernet mac address와 동일

Server Host Name : client는 option으로 원하는 서버 지정 가능

만일 0이면 임의서버, 0이 아니면 특정 서버 지정

Boot Filename : client는 일반적인 Boot Filename 기술

서버가 응답시(Reply) Boot file의 실제 경로 제공

vendor-specific information : bootp의 확장과 추가적인 parameter에 사용

Target Board Host

Bootp RequestPort 67, ip 0.0.0.0

Bootp ReplyPort 68, ip 211.104.101.228

bootp request시 client가 자기 자신의 ip를

모르면 ip 0.0.0.0으로 보내고 reply시 server가

client ip 주소를 채워서 보내준다

port사용은 server는 67 client는 68 사용

Bootp Bootp 패킷패킷 형식형식((format)format)

Page 32: Embedded Linux 강좌

32

Embedded Linux 강좌

Bootp 설치(1)

1. bootp를 사용하기 위해서는 먼저 xinetd가 설치되어 있어야한다.xinetd 프로세스는 target 으로 보낸 패킷을 검출하여 bootpd 데몬을 요청하면 해당 bootpd 데몬이호출되도록 토크해주는 역할을 하고 Xinetd.conf에 설정된 데몬들(tftp, bootp, telnet, ftp등)을 관리한다.대부분의 네트워크 서버들은 리퀘스트를 기다리며 대기하고 있는 서브 프로세스들을 가지고 있지 않다. 그래서 이 일은 xinetd라는 놈이 대신 하게 되는데, Xinetd는 Xinetd.conf에 설정된 모든 네트워크 포트들을듣고 있다가 리퀘스트가 오면 해당하는 서버를 기동하는 역할을 한다.

# rpm -qa | grep xinetd만약 설치되어 있다면 xinetd-2.3.4-08 과 같은 메시지가 뜰것이다.xinetd는 리눅스 배포판에 기본으로 설치 되어 있다.

2. xinetd 서비스가 리눅스상에서 실행되고 있는지 확인한다.

# ps -aux | grep xinetd실행이 되고 있지 않다면

# service xinetd start 또는 # service xinetd restart리눅스 기동시에 xinetd 서비스를 하고 싶다면

# ntsysv 에서 xinetd를 체크하면 된다.

Page 33: Embedded Linux 강좌

33

Embedded Linux 강좌

Bootp 설치(2)

3. bootp를 설치 한다.

# rpm –qa | grep bootp //만약 bootp가 인스톨 되어있지 않다면..

# cd /root/XHYPER255A/RPM# rpm -Uvh bootp-2.4.7-7.i386.rmp# rpm -qa | grep bootp 로 설치를 확인 한다.

Boopt가 정상적으로 설치가 되면 /usr/sbin 디렉토리에 bootpd 파일이 설치된다.

4. bootp를 xinetd 모드로 실행하기 위해서는 /etc/xinetd.d/

디렉토리에 bootp 란 설정파일을 생성 한다.

# cd /etc/xinetd.d# vi bootp

service bootps{

disable = no // 서비스를 하겠다는 의미

socket_type = dgram // 비연결형 지향 프로토콜, 단순, 빠름

protocol = udp //udp의 구조가 tcp보다 단순해 빠른 전송이 가능

wait = yesuser = rootserver = /usr/sbin/bootpd // bootp 데몬

}

Page 34: Embedded Linux 강좌

34

Embedded Linux 강좌

Bootp 설치(3)

5.bootptab 파일 설정, 타겟보드의 bootp요청이 있을 때 호스트에설치한 bootp 서버는 /etc/bootptab에 정의된 client 정보를 기반으로bootp reply packet을 생성하여 응답한다.

# cd /etc# vi bootptab

xhyper255:₩ (줄바꿈) // hostnameht=1:₩ // hardware type, ethernet은 1ha=0x123456789A00:₩ // 타겟보드의 MAC Addressip=192.168.1.50:₩ // 타겟보드에 적용될 IPsm=255.255.255.0 // subnetmask는 호스트와 같아야한다.

주의 할점은 Host PC의 IP 대역과 타겟보드의 줄 IP 대역이 같야야 한다.

MAC Address는 /root/XHYPER255A/Bootloader/Boot-XHYPER255/src/include/config.h에 있다.

(예: 호스트 192.168.1.6 타겟보드 192.168.1.50)

Page 35: Embedded Linux 강좌

35

Embedded Linux 강좌

Bootp 설치(4)

6. 위의 설정이 잘 되어도 Linux install시에 방화벽을 설정했다면bootp서비스가 안 될 수도 있다.(※ 터미널에서 lokkit을 이용하여 방화벽을 No Firewall로 설정하면된다.)

lokkit은 iptables 와 연관이 되어있어서 No Firewall로 설정시/etc/sysconfig/iptables 파일이 지워져서 방화벽 설정이 적용되지않는다.

7.타겟보드 ip 할당 받기# minicomXHYPER255B>bootp

Boot Packet received.Host (server) Ethernet : 0050 DA90 7A10Host (server) IP : 192.168.1.6Client (target) Ethernet : 1234 5678 9A00Client (target) IP : 192.168.1.50

Page 36: Embedded Linux 강좌

36

Embedded Linux 강좌

Tftp 설치(1)

1. ttfp 가 설치 되어있는지 확인하여 설치가 되어있지 않다면 설치한다.# rpm -qa | grep tftp // 설치가 안되어 있다면# cd /root/XHYPER255A/RPM# rpm -Uvh tftp-server-0.17-9.i386.rpmtftp는 반드시 서버용으로 설치를 해야 한다.

2. /etc/xinetd.d 디렉토리 밑에 tftp 설정파일을 생성한다. # cd /etc/xinetd.d# vi tftp

service tftp{

socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /tftpboot disable = no

}

Page 37: Embedded Linux 강좌

37

Embedded Linux 강좌

Tftp 설치(2)

3. tftp 설정파일에서 server_args = -s /tftpboot 이란 항목은/tftpboot 디렉토리 내의 파일만 전송 할 수 있다는 설정이다. /tftpboot 디렉토리를 만들고, 그 디렉토리에 zImage, root 파일시스템등을 복사 한다.# mkdir /tftpboot# cp /XHYPER255A/Kernel/2.4.18-rmk7-pxa1-

xhyper255/arch/arm/boot/zImage /tftpboot# cp /XHYPER255A/Image/rootfs.img /tftpboot

4. xinetd 서비스를 재기동한다.# service xinetd stop# service xinetd start# netstat -au | grep bootp# netstat -au | grep tftp

netstat 명령으로 bootps와 tftp 서비스가 됨을 확인한다.

Page 38: Embedded Linux 강좌

38

Embedded Linux 강좌

Kernel 과 root 파일시스템 fusing 하여 타겟보드로 부팅하기

1. 미니컴을 기동한다.# minicom //command mode로 진행되기 위하여 3초안에 타이핑을 해야 한다.

XHYPER255A>2. 타겟보드에 IP 할당 받기XHYPER255a> bootp

3. zImage 및 rootfs.img 전송 및 fusingXHYPER255A> tftp zImage kernel

zImage를 SDRAM의 커널영역(0xA0000000)에 다운로드 한다.

XHYPER255A> flash kernelSDRAM에 다운받은 커널이미지를 플레시 메모리영역에 라이트 한다.

XHYPER255A> tftp rootfs.img rootrootfs.img를 SDRAM의 0xA0000000 Address로 다운로드 한다.

XHYPER255A> flash rootSDRAM에 다운받은 파일시스템 이미지를 플레시에 라이트 한다.

XHYPER255A> bootBoot 명령으로 타겟보드에서 에러없이 로그인 화면이 나오면 성공이다.

Page 39: Embedded Linux 강좌

39

Embedded Linux 강좌

2. Xinetd

리눅스 시스템이 부팅될때 적재되는 서비스 데몬들을 관장하는 슈퍼 데몬을Xinetd 데몬이라 하는데, 기존의 슈퍼 데몬인 inetd의 문제점인 비율적인리소스관리와 보안성문제를 극복하였으며, TCP wrapper의 기능을 흡수하여 보안이 강화되었다.

<Xinetd 데몬의 특징>

TCP, UDP, RPC 서비스 접근 제어 조절기능(Access Control)

서비스 거부(Denial of Service) 공격 방지

철저한 로긴(loggin) 기능

원격 호스트로 서비스 리다이렉션

IPv6 지원

Page 40: Embedded Linux 강좌

40

Embedded Linux 강좌

Xinetd 설치

대부분 xinetd 데몬은 이미 설치되어 있다.그러므로 소스를 컴파일 하여 설치하거나 상위 버전을 설치하는 기준으로 생각한다.

[root@localhost root]# tar xvfz xinetd-2.1.8.9pre14.tar.gz

[root@localhost root]# cd xinetd-2.1.8.9.pre14

[root@localhost root]# ./configure –prefix=/usr –sysconfdir=/etc –with-loadavg –with-libwrap

[root@localhost root]# make

[root@localhost root]# make install

옵 션 설 명

--with-loadavg접속한 한계를 넘어선 경우 일부 서비스 실행을 중지시킨다.

(DoS로 부터 보호)

--with-libwrapTcp 램퍼를 위한 libwrap 컴파일하는 옵션으로 시스템 보안을 위하여 이옵션도 함께 사용가능 하도록 한다.

--with-inet6 IPv6 주소 체제를 사용할 때 이 옵션을 사용한다.

Page 41: Embedded Linux 강좌

41

Embedded Linux 강좌

Xinetd 설정(xinetd.conf)/etc/xinetd.conf 파일에서 설정해 준다.xinetd.conf 설정 파일은 default section과 service section 으로 구성 되어 있다.

default section은 xinetd 데몬에서 다루는 모든 서비에 적용되는 여러 유용한 속성과 속성 값들을 지정해 주는 부분으로 서비스 거부(DoS:Denial of Service) 공격과 같은 외부의불법적인 공격이나 침입에 대해서 보안성을 제공할 수 있다.

service section은 하나의 xinetd.conf 파일내에 서비스 하고자 하는 모든 서비스 데몬들을 default section과 같은 형식으로 “Service 서비스명”을 선언 하고 설정할수 있으며, includedir 속성을 이용하여 /etc/xinetd.d 의 디렉토리에 실행하고자 하는 서비스마다 실행 파일을 만들어 서비스 할 수 있다.(ntsysv 명령으로 이들 서비스들을 부팅시에 작동하거나 작동하지 않도록 할 수 있다.)

default

{

<속성 attribute> <연산자 assign_op> <값 value> <값 value> ….

}

Service 서비스명(service_name)

{

<속성 attribute> <연산자 assign_op> <값 value> <값 value> ….

}

Page 42: Embedded Linux 강좌

42

Embedded Linux 강좌

default section의 주요 속성(1)

Instances = 60

동시에 서비스를 실행 할 수 있는 서버의 최대 개수를 지정한다. 접속제한을 두지 않을 경우는UNLIMITED로 지정 할 수 있다. 이 속성값을 잘 설정하면 DoS공격을 막을 수 있다.

log_type = SYSLOG authpriv

어떠한 포맷으로 기록을 저장 할 것인가를 지정하는 속성으로 SYSLOG과 FILE 두 포맷을 사용한다.

• SYSLOG : 지정된 facililty에서 syslog로 로그 기록이 전달 된다.

• 사용가능한 facility : daemon, auth, authpriv, user, local0~7

• 레벨수준 : emerg, crit err, warning, notice, info, debug 등

log_on_success = 속성값

서버가 시작될 때와 끝날 때 기록될 것들을 지정한다.

•PID : xinetd 프로세스 ID

•HOST : 원격 호스트 IP

•USERID : 원격 사용자의 ID

•EXIT : 서비스가 빠저 나갈때의 상태

•DURATION : 서버 세션(session) 지속 상태

Page 43: Embedded Linux 강좌

43

Embedded Linux 강좌

default section의 주요 속성(2)Log_on_failure = 속성값서버가 리소스 부족으로 시작 될 수 없거나 설정 파일내의 규칙에 의한 접근이 거부되었을때 기록될 값들을 지정하는 속성이다.

•HOST : 원격 호스트의 아니피 주소

•USERID : 원격 사용자의 ID

•ATTEMPT : 실패한 시도가 있을 경우

•RECORD : 클라이언트에 대한 가능한 정보

only_from =특정 서비스를 이용 가능한 원격 호스트를 설정한다. 속성에 값이 주어지지 않으면 모든 접속이 허용되지 않는다. 서버에 접속이 가능한 원격 호스트는 도메인 주소가 아닌IP 주소로 지정해 준다. (IP 주소 형태(192.168.1.1) 또는 네트워크 주소/넷마스크(192.168.1.0/24) 형태로 지정해 줄수 있다)

per_source = 5똑같은 원격 IP 주소가 로컬 서비스에 접속 할 수 있는 최대 접속 수를 지정해 주는 속성이다. 속성값을 조절함으로써 DoS공격을 막을수 있다.(무제한 접근을 허용하려면“UNLIMITED”값을 사용한다.)

Page 44: Embedded Linux 강좌

44

Embedded Linux 강좌

default section의 주요 속성(3)

Enable = pop3s imaps실행 가능한 서비스의 목록을 표시할 수 있게 한다. 나열된 서비스명만 실행히 가능하다.(disable 속성과 DISABLE 플래그가 존재 할 경우 이 속성은 무시 된다.)

no_access = 0.0.0.0/0서버 서비스를 이용하지 못하도록 서버에 접근하지 못하게 할 원격 호스트의 주소를지정해 주는 속성이다. 접근 거부할 원격 호스트는 네트워크 주소 또는 IP 주소/넷마스크 형태로 지정해 주며, only_from 속성과 함께 사용하여 TCP Wrapper 기능을 부여한다.

TCP 램퍼(Wrapper)는 intel에 의해 서비스되는 TCP 서비들에 대하여 외부로 부터의 접근을 제어 할 수 있도록 해 주는 보안 프로그램이다. TCP 램퍼는 서비스를 요청하는 호스트들을 검사하여 서버를 실행하도록 하거나 호스트로의 접근을 허용 또는 거부하여 시스템을 보호해 주는데, /etc/hosts.allow와 /etc/hosts.deny 두 설정 파일로 쉽게 설정할 수 있다.

Disable = shell login exec finger나열된 서비스 값들을 실행되지 못하게 한다.

includedir = /etc/xinetd.dservices 섹션을 /etc/xinetd.conf 파일내에 지정하지 않고 서비스마다 하나의 파일로지정하고자 할 때 includedir 속성으로 서비스 파일이 위치할 티렉토리를 지정해 준다. (이속성을 사용할 경우 xinetd.conf 파일내에서는 services 섹션을 설정할 수 없다.)

Page 45: Embedded Linux 강좌

45

Embedded Linux 강좌

service section의 주요 속성(1)

service ftp

설정하고자하는 서비스 이름을 지정한다.(지정한 서비스들은 /etc/services 파일 리스트에 있어야 한다.)

disable = yes

해당서비스가 실해되지 못하게 설정한은 사용한다. 해당 서비스를 뛰우지 않거나proftp나 httpd와 같이 standalone 상태로 데몬이 작동하는 경우에 yes를 지정하고, 텔넷이나 POP-3와 같이 항상 서비스가 작동하도록 하기 위해서는 no를 설정 한다.

protocol = tcp

서비스가 사용할 프로토콜을 설정한다. 프로토콜은 /etc/protocols 내에 있어야 하며, 지정하지 않으면 서비스가 사용하는 기본 프로토콜을 사용하게 된다.

socket_type = stream

•Stream : Stream 기반의 서비스

•Dgram : datagram 기반의 서비스

•Raw : IP에 직접 접근을 요하는 서비스

•Seqpacket : 신뢰성있는 연속적인 데이터그램 전송을 요구하는 서비스

Page 46: Embedded Linux 강좌

46

Embedded Linux 강좌

service section의 주요 속성(2)

flags = REUSE

flag 종류 설 명

REUSE 서비스 소켓에 SO_REUSEADDR 플래그를 설정

INTERCETP패킷이나 허용된 접속을 가로채어 허가된 위치에서 접속하는지 인증하고자할 때 사용

NORETRY 프로세서가 새롭게 생기지 못할 경우 재시도하지 못하도록 한다.

IDONLY원격 호스트가 원격 사용자를 인증할때만 접속을 허용한다. 접속기반 서비스에 적용되며, USERID log 옵션을 사용하지 않을 경우 효과를 내지 못한다.

NAMEINARGS서버가 작동될 때 서버내에 지정한 것과 같이 server_args내의 첫번째 인수가 arg[0]이 되도록 한다. 서버내에 tcpd를 넣어 tcpd를 사용할 수 이게 하고, inetd처럼 server_args내에 서버 이름을 넣을 수 잇게 한다.

NODELAYTCP 서비스에 한해서 작용하며, TCP 서비스에 설정하면 TCP_NODELAY 플래그가 소켓에 설정된다.

DISABLE 서비스가 실행되지 않게 한다.

KEEPALIVETCP 서비스에 한해서 작용하며, TCP 서비스에 설정되면 SO_KEEPALIVE 소켓 플래그가 소켓에 설전된다.

Page 47: Embedded Linux 강좌

47

Embedded Linux 강좌

service section의 주요 속성(3)

wait = yes서비스가 yes인경우 단일 스래드(single thread)로 실행되어 오직 하나의 서비스만 작동하며, no인겨우는 다중 스래드(multi-thread)로 서버가 새로운 서비스 요청을 받아들이게 된다.

user = root서버 프로세서를 실행할 수 있는 사용자의 ID를 나타내는 것으로 슈퍼유저일 경우에만 효과를 낼 수

있다.

server = /usr/sbin/in.proftpd해당 서비스를 실행할 데몬 프로그램을 지정한다.

access time = 01:00-07:00지정된 시간에서만 서비스를 이용할 수 있게 해준다.

redirect = 192.168.1.10 23TCP 서비스를 다른 호스트에게 이양하고자 할 때 사용한다.(설정 방법은 IP 주소 포트번호 이다.)

port = 8080서비스 포트를 명시해 주며, 포트는 /etc/services 파일 목록내의 서비스 포트와 일치해야 한다.

nice =10서버의 예약 우선권을 나타내는 속성으로 –20~19까지의 범위를 갖는다.

Page 48: Embedded Linux 강좌

48

Embedded Linux 강좌

3. bootp

네트워크 부팅이 될 수 있게 해 주는 데몬으로 시스템을 부팅시키는 운영체제(OS)가 저장된 디스크 장치로 X 단말기 등의 디스크를 갖지 않는단말기가 네트워크를 경유하여 작동하는 어드레스 자동 취득 프로토콜이다.

디스크가 없는 단말기인 BOOTP 클라이언트는 작동시에 BOOTP서버로 부터 자동프로그램을 취득하여 BOOTP에는 IP 어드레스를 자동 취득하는 기능이 입력되어 있다.

클라이언트는 작동 프로그램을 수신하기 전에 RARP라는 프로토콜을사용하여 자기 자신의 IP 어드레스를 취득한다. BOOTP 서버상의 MAC어드레스와 IP어드레스의 대응 테이블은 사전에 시스템 관리자가 작성해두는 것으로 클라언트에 할당하는 IP는 고정이다.

Page 49: Embedded Linux 강좌

49

Embedded Linux 강좌

BootpBootp와와 관련된관련된 환경설정환경설정 화일화일

1. Bootptab

[host]# cd etc[host]# vi bootptab.default:\

:hd=/user/boot:bf=null:\:sm=255.255.255.0

Linux:ht=1:ha=0x00D0CAF12620:tc=.default

Bootptab file은 /etc directory안에 있다.

Bootptab file은 bootptab 서버가 응답할 MAC address의 목록을 설정한다.

sm 부분은 서브넷 마스크를 포함한다.

hd 부분은 host directory 포함한다.

ht 부분은 랜의 하드웨어 형태를 포함한다.

ha 부분은 이더넷카드의 하드웨어 주소를 포함한다.

Page 50: Embedded Linux 강좌

50

Embedded Linux 강좌

BootpBootp와와 관련된관련된 환경설정환경설정 화일화일

2. Xinetd.conf

[host]# cd etc[host]# vi xinetd.conftftp dgram udp wait root /usr/sbin/in.tftpd /tftpdirBootps dgram udp wait root /usr/sbin/tcpd bootpd

Inetd.conf 에서 해당하는 서버를 동작하기 원하면 주석만 제거하면 된다.

3. hosts

[host]# cd etc[host]# vi hosts127.0.0.1 localhost.localdomain localhost211.104.101.227 linux

hosts file은 사용하고 있는 target 보드의 IP 주소를 포함한다.

host의 이름은 bootptab에 있는 host 이름과 같다.

위 내용은 bootp가 linuxcerf에 고정 IP 주소를 할당하도록 하는 것이다

Bootptab에서의 가상ip명과 같아야 한다 (linuxcerf)

Page 51: Embedded Linux 강좌

51

Embedded Linux 강좌

[host]# cd etc[host]# vi servicesbootps 67/tcp # boop server tftp 69/udp # tftp server

4. services

services file은 사용하고 있는 네트워크 서버들의 데이터 방식과 포트를 설정한다.

현재 bootps는 67번 포트와 tcp를 사용하고 tftp는 69번 포트와 udp를 사용함을

볼 수 있다.

bootps 67/tcp server이고

bootpc 68/udp client 이다.

위와 같이 4가지 환경 설정 화일만 설정하면 문제없이 target과 host간 통신이 이루어짐을 볼 수 있다.

BootpBootp와와 관련된관련된 환경설정환경설정 화일화일

Page 52: Embedded Linux 강좌

52

Embedded Linux 강좌

BootpBootp와와 관련된관련된 데몬데몬

1. Bootpdbootpd 프로세스는 자신의 구성 화일을 읽어서 해당 맥 어드레스를 가진 항목이 있는가를

확인하고 항목이 존재한다면 들어있는 정보를 가지고 응답 패킷을 구성하게 된다. 이 때 몇 가지의 정보(bootptab에 설정된)가 host로부터 target으로 가게 되며 그 목록은

다음과 같다. sm : local lan의 서브넷 마스크hd : host directoryht : 랜의 하드웨어 형태ha : target의이더넷 맥 어드레스

xhyper255:₩ (줄바꿈) // hostnameht=1:₩ // hardware type, ethernet은 1ha=0x123456789A00:₩ // 타겟보드의 MAC Addressip=192.168.1.50:₩ // 타겟보드에 적용될 IPsm=255.255.255.0 // subnetmask는 호스트와 같아야한다

Page 53: Embedded Linux 강좌

53

Embedded Linux 강좌

bootp 메시지는 고정길이 필드(총 300바이트) 사용 : Request와 Reply가 같은 양식을 사용

Opcode : message type 1=Request , 2=Reply

Hardware type : 1= 10 Base Ethernet

Hardware address Length : 6 = 10 Base Ethernet

HOP count : 클라이언트에서 0으로 Setting, 게이트웨이에 의해 임의로 사용

Transaction ID : 32bit 정수(Random), client가 set, server가 return

client는 Request와 Reply가 같은지를 확인

Client IP address

Server Hostname (64bytes)

Your IP addressServer IP address

Gageway IP address

Client hardware address (16bytes)

Boot filename (128bytes)Vendor-specific information (64bytes)

UnusedNumber of secondsTransaction ID

Hop countHardware ddressLength(6=ethernet)

Hardware type1 = Ethernet

Opcode1=Request,

2=Rep

0 7 8 15 16 23 24 31bit

300bytes

Bootp Bootp 패킷패킷 형식형식((format)format)

Page 54: Embedded Linux 강좌

54

Embedded Linux 강좌

4. tftp

Tftp는 Trivial File Protocol로서, ftp와비슷한점은네트워크를통한파일전송서비스라는 것이다. 그러나 ftp는 신뢰성을 보장하는 tcp 전송방식을 사용하지만 tftp는 단방향 핸드쉐이킹 방법인 udp를 통한전송방식을 사용한다.

udp는 tcp와는 달리 신뢰성은 부족하지만 udp의 구조가 tcp보다 훨씬 단순화되어 있기 때문에 빠른 전송이 가능하다.

udp는 단지 메시지를 브로드 캐스느를 하게 되어 수신측에서 수신하는지에 상관없이 목적지를 향해 데이터를 보내서 라우팅이 복잡하거나 네트워크가 혼잡할 경우 패킷이 유실될 우려가 있기도 한다.

Page 55: Embedded Linux 강좌

55

Embedded Linux 강좌

tftp 패킷 형식

IP Header UDP Header TFTP Message

IP Datagram

UDP Datagram

20bytes 8bytes =<512bytes

512 bytes의 Data Block을 전송한다.

각 Block은 아주 간단한 4bytes 헤더와 연결

Block의 전송 번호는 항상 1부터 시작한다.

ASCII 또는 Binary 전송을 지원한다.

Remote File을 Read하거나 Write할 때 사용한다.

No Checksum

높은 처리율보다는 간단함을 강조한 프로토콜이다.

Page 56: Embedded Linux 강좌

56

Embedded Linux 강좌

TFTP Protocol Data Unit(5 가지 타입)

OPCODE = 1 File name 0 mode 0

Read Request (RRQ)

2bytes String N Byte 1byte String N Byte 1byte

Write Request (WRQ)

OPCODE = 2 File name 0 mode 02bytes String N Byte 1byte String N Byte 1byte

Data(DATA)

OPCODE = 3 Block# DATA2bytes 2bytes =<512bytes

Acknowledgement (ACK)

OPCODE = 4 Block#2bytes 2bytes

Error(ERROR) /File not found /No space to write file no disk.

OPCODE = 5 Error code Error Message 02bytes 2Bytes 1byteString N Byte

Page 57: Embedded Linux 강좌

57

Embedded Linux 강좌

1. inetd.conf [host]# cd etc[host]# vi inetd.conftftp dgram udp wait root /usr/sbin/in.tftpd /tftpdirBootps dgram udp wait root /usr/sbin/tcpd bootpd

Inetd.conf 에서 tftp의 주석만 제거하면 설정된다.

가져가기 원하는 디렉토리를 설정한다 (/tftpdir)

tftp tftp 설정설정(1)(1)

0Mode0File nameOpcode = 22bytes Sting N

bytes1byte String N

bytes1byte

2. Write Request

클라이언트는 Write Request 서버의 port 69를 통해 전송 (file name과mode 확정) 서버는 port를 준비 후 ACK와 Number 0을 전송하고 클라

이언트는 최초 512 바이트의 데이터를 전송한다(Block Number는 1이다. 그리고 이 후의 동작은 Read Request와 동일하다.

Page 58: Embedded Linux 강좌

58

Embedded Linux 강좌

tftp tftp 설정설정(2)(2)

3. Read Request

0Mode0File nameOpcode = 12bytes Sting N

bytes1byte String N

bytes1byte

클라이언트는 Read Request 서버의 port 69를 통해 전송 (file name과 mode 확정)

서버는 전송을 위한 port 준비

서버는 최초 512 바이트의 데이터를 전송 (Block Number = 1)

클라이언트는 접수된 Block에 대해 단지 ACK와 함께 Block Number 1을 전송

서버는 512 바이트의 Block을 전송 (Number = 2)

클라이언트는 ACK 와 Block Number 2를 전송

서버는 맨 마지막 Block( 512바이트 보다 작은)을 전송

클라이언트는 Block의 크기가 512 바이트보다 작으면 마지막 Block으로 인식한다.

혹시 마지막 Block이 512바이트이면, 서버와 클라이언트는 opcode와 block number 만을 전송한다.

Page 59: Embedded Linux 강좌

59

Embedded Linux 강좌

5. NFS (Network File System) 설정(1)

타겟보드의 제한된 저장공간(flash)을 호스트 PC의 저장공간(하드디스크)을 이용하여 저장공간의 크기를 확장한다.

1. 호스트 PC 환경 설정

# mkdir nfs --NFS로 공유할 디렉토리 명을 /nfs라고 한다면 디렉토리를 만든다.

# chmod 777 nfs

2. NFS 환경 파일을 수정한다.

# cd /etc

# vi exports

/mnt/nfs 192.168.1.0/24(rw,insecure)

/mnt/nfs는 NFS로 공유할 디렉토리로 192.168.1.0/24 라는 호스트가 암호 인증 없이 읽고 쓸 수있다. [192.168.1. 대역대는 모두 허용함]

rw : r 은 읽기를 허용, w 는 쓰기를 허용.

insecure : 암호 인증을 하지 않겠다는 의미.

Page 60: Embedded Linux 강좌

60

Embedded Linux 강좌

NFS (Network File System) 설정(2)

3. NFS 데몬 수행(NFS 데몬은 반드시 stop 시켰다 start 해야 한다)

# service nfs stop

# service nfs start

# rpcinfo -p ---명령으로 portmapper, nfs, mountd 가 제대로 등록되었는지 확인 한다

4. 타겟보드에 /mnt/nfs 디렉토리 생성 후 mount 하기

# mkdir /mnt/nfs

# mount -t nfs -o nolock 192.168.1.6:/mnt/nfs /mnt/nfs

호스트 PC (IP:192.168.1.6)의 /mnt/nfs 디렉토리를 타겟보드의 /mnt/nfs에 마운트 한다.

5. 호스트 PC의 /mnt/nfs 디렉토리에 파일을 하나 만들고 타겟보드에서 확인 하기

# cd /mnt/nfs (호스트에서 실행)

# touch aaa (호스트에서 실행)

# cd /mnt/nfs (타겟보드에서 실행)

# ls –al (타겟보드에서 실행)

aaa란 파일이 타겟에서 보이면 성공입니다.

Page 61: Embedded Linux 강좌

61

Embedded Linux 강좌

6. Goahead webserver 설치(1)

1. goahead webserver 다운로드 (위치 : /root/goahead )

http://data.goahead.com/Software/Webserver/2.1.6/webs216.tar.gz

2. 다운받은 웹서버의 압축을 풀고 ARM용으로 컴파일 한다.

# cd /root/goahead

# tar xvzf webs216.tar.gz

# cd ws030325 // goahead 압축을 푼 디렉토리

# cd LINUX // linux용 웹서버를 만들기 위해서…

3. Makefile을 수정한다. ARM용으로 컴파일 하기 위해서 몇 라인을 추가한다.

# vi Makefile

CC = arm-linux-gcc

AR = arm-linux-ar

clean :

rm -f *.o

rm -f ../*.o

가장 마지막 줄의 cc -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $< 를

$(CC) -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $<로 수정

Page 62: Embedded Linux 강좌

62

Embedded Linux 강좌

Goahead webserver 설치(2)4. main.c 파일을 수정하여 웹서버의 홈디렉토리와 포트 번호를 수정한다. 수정하지 않고 디폴트로 사용해도 무방하다.

# vi main.c

*rootweb = T(“web”); // 42 line 타겟보드의 webservice 디렉토리

port = 80; // 44line 사용할 포트 번호

적절한 웹 서버의 동작을 위해 다음과 같은 파일을 수정하도록 한다.

먼저, 수정될 내용은 웹 서버에서 가장 먼저 보여지게 되는 첫 페이지에 대한 파일 이름을 지정으로, 이는 임의의 클라이언트가 웹 서버로 접속 했을 경우 처음으로 보여지는 페이지를 말한다.

main.c 소스코드의 webHomePageHandler 함수를 통해 그 파일의 이름을 지정할 수 있으며, 추후에 이 파일의 내용은 html 언어를 사용하여 작성하도록 한다.

# vi main.c

static int websHomePageHandler ( webs_t wp, char_t *urlPrefix, char_t

*webDir, int arg, char_t *url, char_t *path, char_t *query)

{

if (*url == '₩0' || gstrcmp(url, T("/")) == 0)

websRedirect ( wp, T(“ index.html "));

}

Page 63: Embedded Linux 강좌

63

Embedded Linux 강좌

Goahead webserver 설치(3)

5. 설정을 끝냈으므로 make 한다.

# make // 에러 없이 컴파일 되면 webs 웹서버구동 파일이 생성된다.

6. 생성된 webs 파일을 TARGET 보드로 올라갈 파일 시스템의 소스가 있는 디렉토리의 적당한 곳에

복사 한다.

# cp webs /root/XHYPER255A/FileSystem/root_xhyper25/bin

7. TARGET보드에 올라갈 파일 시스템의 /(루트) 디렉토리 밑에 webserver 소스의 web 디렉토리를복사 한다.

방법 1) # pwd

ws 030325

# cp -r web /root/XHYPER255A/FileSystem/root_xhyper255/

방법 2) # pwd

ws 030325

# tar cvzf web.tar.gz web

# cp web.tar.gz /root/XHYPER255A/FileSystem/root_xhyper255/

# tar xvzf web.tar.gz

Page 64: Embedded Linux 강좌

64

Embedded Linux 강좌

Goahead webserver 설치(4)

8. TARGET 보드에 올라갈 파일 시스템의 /etc/inittab 파일에 웹서버를 추가하여 부팅과 동시에 웹서버가 올라갈 수 있게 한다.

# cd /root/XHYPER255A/FileSystem/root_xhyper255/etc/

# vi inittab

goahead:3:once:/bin/webs & // 파일의 맨 끝에 추가

9. target 보드의 /etc/hosts 파일을 수정한다.

#cd /etc/

#vi hosts

127.0.0.1 localhost Linux

192.168.1.50 xhyper250

10. 파일 시스템 을 다시 만들어 TARGET 보드로 전송

# r.sh // 파일 시스템을 생성하는 shell script

11. 새로 생성된 root 파일 시스템을 fusing한다.

12. web 브라우저를 이용하여 접속을 한다.

target 보드의 IP / home.asp 예)http://192.168.1.50/home.asp

goahead웹서가 뜨면 성공이다.

Page 65: Embedded Linux 강좌

65

Embedded Linux 강좌

7. Busybox컴파일 하기(1)

Busybox란 target 보드에서 리눅스의 기본 명령어들을 실행할 수 있게 만들어 주는 명령어 해석기와유틸리티의 모음입니다.

busybox는 http://www.busybox.net/download.html 에서 다운 받으실 수 있습니다.

1. 다운로드한 busybox-0.60.1.tar.gz 의 압축을 풉니다.

# tar xvfz busybox-0.60.1.tar.gz

2. 압축을 풀면 busybox-0.60.1 디렉토리가 생기게 됩니다.

# cd busybox-0.60.1

압축을 해제한 디렉토리로 이동을 합니다.

이동 후에 반드시 INSTALL파일을 읽어 봅시다.

3. Config.h 파일을 수정하라고 INSTALL파일에 나오는데 이것은 자기가 busybox에 넣을 프로그램과 뺄 프로그램을 선별 할 수 있게 해주는 겁니다.

// 를 추가 하고 제거함으로서 사용할 수 있는 명령어들을 선택할 수 있습니다.

Vi, insmod, rmmod, ifconfig등은 기본적으로 주석처리되어 사용할 수 없게 되어있으니 이런 명령을 사용하려면 주석을 제거 해주면 됩니다.

Page 66: Embedded Linux 강좌

66

Embedded Linux 강좌

Busybox컴파일 하기(2)

4. 그다음은 Makefile의 수정입니다.

<< 수정된 Makefile >>

DOSTATIC = false 에서 DOSTATIC = true 로 변경합니다.

# If you are running a cross compiler, you may want to set this

# to something more interesting, like "powerpc-linux-".

CROSS = arm-linux- // 원래는 위와 같이 비어 있습니다. 거기에 arm용 cross컴파일러를 아래와 같이 써줍니다.

CC = $(CROSS)gcc

AR = $(CROSS)ar

STRIPTOOL = $(CROSS)strip

원래는 위와 같이 비어 있습니다. 거기에 arm용 cross컴파일러를 아래와 같이 써줍니다.

5. make 수행입니다.

그러나 무턱대고 그냥 make를 실행시키면 컴파일이 안됩니다. 소스에서 약간 수정해

줄 부분이 있습니다.

Page 67: Embedded Linux 강좌

67

Embedded Linux 강좌

mount.c 파일과 umount.c 파일(1)

각 파일에 #include <sys/param.h>

를 추가를 해줍시다. 그래야지만 Error를 방지 할 수 있습니다.

<< mount.c파일 >>

을 보면, 아래와 같이 수정해 줍시다.

#include <limits.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <stdio.h>

#include <mntent.h>

#include <ctype.h>

#include <sys/param.h> <--- 추가해준 부분이다.

#include "busybox.h"

Page 68: Embedded Linux 강좌

68

Embedded Linux 강좌

mount.c 파일과 umount.c 파일(2)

<< umount.c파일 >>

을 보면, 아래와 같이 수정해 줍시다.

#include <limits.h>

#include <stdio.h>

#include <mntent.h>

#include <errno.h>

#include <string.h>

#include <stdlib.h>

#include <sys/param.h> <--- 추가해준 부분이다.

#include "busybox.h"

이렇게 소스에서 두부분을 추가해 주어야 합니다..

Page 69: Embedded Linux 강좌

69

Embedded Linux 강좌

mount.c 파일과 umount.c 파일(3)

# make

를 수행하면 에러없이 컴파일이 되는 것을 알 수 있다.

컴파일이 제대로 수행되었을때 다음과 같은 메시지를 맨 마지막 부분에서 확인 할 수 있다.

------------------------------------------------------

BusyBox Documentation

mkdir -p docs

pod2text docs/busybox.pod > docs/BusyBox.txt

mkdir -p docs

pod2man --center=BusyBox --release="version 0.60.1"

docs/busybox.pod > docs/BusyBox.1

pod2html --noindex docs/busybox.pod >

docs/busybox.lineo.com/BusyBox.html

mkdir -p docs

------------------------------------------------------

이렇게 해서 컴파일이 제대로 수행이 되면 컴파일한 바이너리들을 설치 하면 된다.

Page 70: Embedded Linux 강좌

70

Embedded Linux 강좌

mount.c 파일과 umount.c 파일(4)

6. make install

INSTALL파일에서는 단순히 make install을 수행하라고 되어있다.

이렇게 하지 말고 자신이 원하는 곳에 busybox에 관련된 파일을 만들려면

우선 /tmp/busybox 디렉을 만든다.

# mkdir /tmp/busybox

그 후에 다음과 같이 make install을 수행하자.

# make PREFIX=/tmp/busybox install

그러면 /tmp/busybox 디렉토리 아래에 busybox에 관련된 파일들이 설치 될 것이다.

이렇게 설치 한것을 자신이 사용하려는 임베디드 장비의 root파일 시스템을 만들면 된다.

Page 71: Embedded Linux 강좌

71

Embedded Linux 강좌

Busybox 최신버전 인스톨 방법(1)

www.busybox.net/download.html 에서 최신 버전의 busybox를 다운 받는다.

# tar xvzf busybox-1.00-pre9.tar.gz

# cd busybox-1.00-pre9

# vi INSTALL // 인스톨 하기 전에 한 번 읽어 본다.

# make menuconfig

Build Options -

[*] Build BusyBox as a static binary (no shared libs)

[*] Do you want to build BusyBox with a Cross Compiler?

/usr/local/hybus-arm-linux-R1.1/bin/arm-linux-

Module Utils -

Insmod, lsmod, rmmod 등을 선택한다.

저장을 하고 빠져 나온다.

Page 72: Embedded Linux 강좌

72

Embedded Linux 강좌

Busybox 최신버전 인스톨 방법(2)

# make dep

# make

마지막에 아래와 같은 메시지가 나오면 컴파일 제대로 된 것이다.

BusyBox Documentation

Mkdir –p docs

Pod2text docs/busybox.pod > docs/BusyBox.txt

:

mkdir -p docs

그리고 busybox 파일이 생성 된다. (ARM 용)

# file busybox //busybox가 어떤 파일포멧으로 됐는지 확인한다.

ELF 32 bit LSB executable, ARM, version 1(ARM), for GNU/Linux 2.0.0, statically linked, stripped

# mkdir /tmp/busybox

# make PREFIX=/tmp/busybox install // tmp/busybox/ 디렉토리에 인스톨

# cd /tmp/busybox

제대로 잘 만들어졌는지 확인 후 타겟보드에 올라갈 파일시스템을 만드는 데에 사용한다

Page 73: Embedded Linux 강좌

73

Embedded Linux 강좌

8. System Cal l 추가하기(1)

1. 먼저 특정 기능을 수행할 시스템 콜을 만든다.

# cd $KERNEL/kernel

# vi rock.c //시스템 콜을 하면 단순히 sys_rock을 화면에 출력하는 소스

#include <linux/kernel.h> //반드시 추가

#include <linux/errno.h>

asmlinkage void sys_rock()

{

printk(“hello sys_rock()₩n”);

}

//asmlinkage라는 키워드는 C로 구현된 함수가 어셈블리 언어로 구현된 함수에서 호출될 때 사용하는 키워드이다.

Page 74: Embedded Linux 강좌

74

Embedded Linux 강좌

System Cal l 추가하기(2)

2. 시스템 콜 호출 번호를 등록 한다.

# cd $KERNEL/include/asm/

# vi unistd.h

#define __NR__rock (__NR_SYSCALL_BASE + 226) //마지막 번호를 추가한다.

3. 시스템 콜의 이름을 등록한다.

# cd $KERNEL/arch/arm/kernel

# vi calls.S

.long SYMBOL_NAME(sys_rock) //마지막에 이름을 추가한다

4. make menuconfig시에 선택할 수 있도록 추가한다.

# cd $KERNEL/arch/arm

# vi config.in

/General을 하여 General 항목에 추가한다.

bool ‘Rock System Call Support’ CONFIG_ROCK_CALL

[*] 또는 [ ]를 선택할 수 있도록 추가하였다.

Page 75: Embedded Linux 강좌

75

Embedded Linux 강좌

System Cal l 추가하기(3)

5. rock.c를 컴파일하면 rock.o 가 생성되어 link가 될수 있도록 한다.

# cd $KERNEL/ kernel

# vi Makefile

obj-$(CONFIG_ROCK_CALL) += rock.o

make menuconfig에서 선택을 해야만 추가가 될 수 있도록 한다.

6. make mrproper

make menuconfig (설정확인)

make dep

make zImage

7. 만들어진 zImage를 target 보드로 전송하여 커널을 변경한다

Page 76: Embedded Linux 강좌

76

Embedded Linux 강좌

System Cal l 추가하기(4)

8. application을 작성한다.

# vi rock_call.c

#include <linux/unistd.h>

_syscall0(void, rock) //시스템콜이 void형선언됐기 때문이고, rock은 시스템 콜의 이름이다.

int main()

{

rock();

return 0;

}

Page 77: Embedded Linux 강좌

77

Embedded Linux 강좌

System Cal l 추가하기(5)

9. application을 컴파일할 Makefile 작성

# vi Makefile

CC = arm-linux-gcc

INCLUDEDIR = /root/XHYPER255A/Kernel/2.4.18-rmk7-pxa1-xhyper255/include

CFLAGS = -I$(INCLUDEDIR) -Wall

all : rock_call

rock_call : rock_call.c

$(CC) $(CFLAGS) –o $@ $<

clean :

rm –f $@

10. 만들어진 rock_call을 타겟보드로 전송하여 실행시킨다.

Zmodem을 이용하여 전송 후

# ./rock_call

# hello sys_rock //화면에 출력이 되면 성공이다

Page 78: Embedded Linux 강좌

78

Embedded Linux 강좌

System Call 2

인자를 추가하여 시스템 콜은 만들어 보자.

1. 시스템 콜을 만든다.

# cd $KERNEL/kernel

# vi eros2.c

#include <linux/kernel.h>

#include <linux/errno.h>

asmlinkage void sys_eros2(int in) //integer형의 인자 in을 추가

{

int years;

years = in;

printk(“₩n EROS SYSTEM CALL ₩n”);

printk(“₩t You are ₩’%d₩’ years old.₩n”, years);

}

2, 3, 4, 5, 6, 7, 9, 10번 단계는 같은 방법으로 하면 된다.

Page 79: Embedded Linux 강좌

79

Embedded Linux 강좌

System Call 2

2. 앞의 8단계의 application만 다르게 작성한다.

# vi eros2.c

#include <linux/unistd.h>

#include <stdio.h>

_syscall1(void, eros2, int, in) //함수형과 시스템 콜 이름외에 인자의 형과 이름을 추가한다.

// _syscall1은 인자가 1개 있기 때문이다. 이런식으로 최대

5개까지 인자 추가가 가능하다.

int main()

{

int my_years;

printf(“₩n Input Your Age:”);

scanf(“%d”, &my_years);

eros2(my_years); //시스템 콜을 호출, 인자와 함께

return 0;

}

Page 80: Embedded Linux 강좌

80

Embedded Linux 강좌

9. BOA 웹서버 설치(1)

Boa 웹서버는 임베디드 기기에서 웹 서비스를 제공하기 위한 용도의 적은 크기의 웹서버이며

http 프로토콜과 cgi 기능지원을 기본으로 갖고 있다.

Boa 웹서를 다운 받을 수 있는 홈페이지는 www.boa.org이고 hyper104는 최신 버전의 Boa 웹서버를

지원하지 않는다. 예전 버전의 Boa 웹서버를 받아서 실행시켜야한다.(실행 불가능요인: libc.so.6의버전 차이 때문…)

예전 버전http://prdownloads.sourceforge.net/boa/boa-0.94.0.tar.gz?download

URL에서 받아서 설치하면 된다.

1. 압축 해제

# tar xvzf boa-0.94.13.tar.gz

# cd boa-0.94.13/src

2. 환경을 설정한다.

#./configure // 대부분 에러 없이 수행 된다.

Page 81: Embedded Linux 강좌

81

Embedded Linux 강좌

BOA 웹서버 설치(2)

3.Makefile 수정

CC = gcc => CC = arm-linux-gcc

CPP = gcc –E => CPP = arm-linux-gcc -E

4. define.h 파일을 수정한다.

#define SERVER_ROOT “/etc/boa” => #define SERVER_ROOT “/usr/local/boa”

5.컴파일을 한다.

#make clean

#make all

Page 82: Embedded Linux 강좌

82

Embedded Linux 강좌

BOA 웹서버 설치(3)

6.컴파일 후 boa-0.94.13(상위) 디렉토리의 boa.conf 파일을 수정한다.

# cd ..

# vi boa.conf

User nobody

Group nobody

ErrorLog /usr/local/boa/log

AccessLog /usr/local/boa/log

ServerName 192.168.1.50 // (target board의 IP를 입력한다.

DocumentRoot /usr/local/boa/html

DirectoryMaker /usr/local/boa/boa_indexer

MimeTypes /usr/local/boa/mime.types

:wq 저장

Page 83: Embedded Linux 강좌

83

Embedded Linux 강좌

BOA 웹서버 설치(4)

7. root filesystem이 되는 디렉토리로 다음의 파일을 copy 한다.

/root/XHYPER255A/Filesystem/root_xhyper255 //root_xhyper255가 root filesystem이 된다.

# mkdir /root/XHYPER255A/Filesystem/root_xhyper255/usr/local/boa

# cp boa /root/XHYPER255A/Filesystem/root_xhyper255/usr/local/boa

# cp boa_indexer /root/XHYPER255A/Filesystem/root_xhyper255/usr/local/boa

# cp ../boa.conf /root/XHYPER255A/Filesystem/root_xhyper255/usr/local/boa

# cp /etc/mime.types /root/XHYPER255A/Filesystem/root_xhyper255/usr/local/boa

# cd /root/XHYPER255A/Filesystem/root_xhyper255/usr/local/boa

# vi log //비어있는 log 파일을 만든다.

Page 84: Embedded Linux 강좌

84

Embedded Linux 강좌

BOA 웹서버 설치(5)

8. 웹브라우저로 보여줄 파일을 만든다.

# mkdir html

# cd html

# vi index.html

<html>

<head>

<title>boa webserver</title>

</head>

<body>

how do you do?

</body>

</html>

:wq 저장

# chown nobody.nobody index.html

Page 85: Embedded Linux 강좌

85

Embedded Linux 강좌

BOA 웹서버 설치(6)

9. root filesystem을 만들어서 보드에 fusing을 한다.

10. target 보드로 부팅…

11. Boa 웹서버를 구동시킨다.

# cd /usr/local/boa

# ./boa

# ps aux | grep boa

12. 웹브라우저에서 확인

Host의 웹브라우저 주소창에 http://192.168.1.50/index.html

Page 86: Embedded Linux 강좌

86

Embedded Linux 강좌

10.N A T 구축(1)공인 IP -> 사설 IP로 변환 : Redirect (Port Forwarding), PREROUTING

사설 IP -> 공인 IP로 변환 : MASQUERADE, POSTROUTING

Target보드에 iptables를 추가하위한 방법

1. www.iptables.org 에서 iptables-1.12.11.tar.bz을 다운받는다.

# tar xvjf iptables-1.12.11.tar.bz --압축을 푼다.

# cd iptables-1.12.11

# vi Makefile

15Line의 내용을 바꾼다.

KERNEL_DIR = /root/XHYPER255A/Kernel/2.4.18-rmk7-pxa1-xhyper255

10line에 내용을 추가한다.

CC = arm-linux-gcc

LD = arm-linux-ld

AR = arm-linux-ar

# make

6. 생성된 iptables를 target의 /bin 디렉토리 밑에 복사한다.

7. extentions 디렉토리 밑의 *.so를 /root/XHYPER255A/Filesystem/root_xhyper255/lib/iptables 디렉토리를 만들어서 *.so 파일을 카피한다.

Page 87: Embedded Linux 강좌

87

Embedded Linux 강좌

N A T 구축(2)4. target board에 올라갈 kernel을 NAT가 되도록 커널컴파일 한다.

# make menuconfig

Network Options

[*] Network packet filtering

[*] socket filtering

IP Network Configurations

[*] conneting tracking

[*]FTP protocol support

[*] iptables support (required)

[*] packet filtering

[*] REJECT //방화벽

[ ] MIRROR //미러링

[*] Full NAT

[*] MASQUERADE Target support

[*] REDIRECT Target support

[*] Packet mangling

[*] Log Target support

Page 88: Embedded Linux 강좌

88

Embedded Linux 강좌

N A T 구축(3)

#make dep

#make zImage

1. Network Interface 간 Forwarding

# echo “1” > /proc/sys/net/ipv4/ip_forward //forwarding이 가능하도록 1로 설정

2. iptable rule 설정

# iptables –t nat –A POSTROUTING –o eth0 –j MASQUERADE

사설 IP를 공인 IP로 바꾸는 rule, eth0은 외부와 연결된 인터페이스

# iptables –t nat –A PREROUTING –p tcp --dport 80 –i eth0 –j DNAT –-to 192.168.10.50:80

공인 IP를 사설 IP의 80번 port로 forwarding 하는 방법, eth0은 외부와 연결된 인터페이스

# iptables –t nat -L 은 nat 설정 확인

# iptables –t nat -F 는 nat 설정 지우기

Page 89: Embedded Linux 강좌

89

Embedded Linux 강좌

11. Device Driver 실행 과정target board에 적재할 device driver를 host에서 작성한 후 arm용 cross

compiler를 통해 compile한 후 ftp를 통해 target board로 다운로드해서 target board에 적재하고 노드를 걸어주는데 까지를 목표한다.먼저 Host 에서 device driver module을 작성한 후, 컴파일을 한다.이 때 사용되는 컴파일러는 arm용 cross compiler이다.Cross compiler에 PATH가 설정되어 있는지 확인한다.PATH가 설정되어 있지 않은 경우 별첨을 참조한다.Compile된 module을 target 보드로 Downloading한 후 적재한다.

Module 적재Module 작성

Module compile

Host

Serial cable

Ethernet cross cableTarget 보드

Page 90: Embedded Linux 강좌

90

Embedded Linux 강좌

IntroductionDevice

하드디스크, 플로피디스크, 프린터, 단말기, 스캐너와 같이 컴퓨터 시스템 이외의 다른 주

변장치

Device on Linux

Linux에서 Device는 파일을 통해서 접근 가능

사용자는 File operation을 적용할 수 있음

Major number와 Minor number를 갖음

Device Driver

서브루틴과 데이터의 집합체

Device와 시스템 사이에 데이터를 주고받기 위한 Interface

표준적으로 동일한 서비스 제공을 목적

디바이스의 고유한 특성을 감춤

커널의 일부분으로 내장

Type of Device Driver

Char device driver

Block device driver

Network device driver

Page 91: Embedded Linux 강좌

91

Embedded Linux 강좌

Device Driver를 커널에 포함시키기(1)여기서는 skeleton.c 라는 skeleton 디바이스 드라이버를 사용할 것입니다 .skeleton 드라이버는 메모리의 일부분을 장치로 인식하여 드바이스 드라이버를 공부하는 데도움이 되는 소스입니다. 이 소스를 모듈형태로 만들어서 필요할 때마다 커널에 포함 시키는 것이 아니라 리눅스 커널에 포함하여 커널을 컴파일 하여 그 기능을 커널에서 지원이 될수 있게 하는 것이 목적입니다.

1. 먼저 skeleton.c 파일을 리눅스 커널 소스의 적당한 디렉토리로 복사한다.

# cp $KERNELSOURCE/driver/char/

skeleton 디바이스 드라이버가 character형이기 때문에 커널소스의 드라이버 아래의 char 디렉토리에 카피한다.

2. skeleton.c 파일의 내용을 수정한다.

먼저 등록될 major 번호를 230번으로 고정한다.

#define SKELETON_MAJOR 230 //27 line

init_module 함수의 내용을 수정한다.

static int __init skeleton_init(void)

{

register_chrdev(SKELETON_MAJOR, “SKELETON”, &skeleton_fops);

return 0;

}

Page 92: Embedded Linux 강좌

92

Embedded Linux 강좌

Device Driver를 커널에 포함시키기(2)

3. 같은 디렉토리에서 Config.in 파일을 수정한다. 커널 컴파일시에 character device >에서선택할 수 있도록 하기 위함이다.

# vi Config.in

bool ‘SKELETON Device Driver Support’ CONFIG_SKELETON //이 내용을 추가한다.

4. 같은 디렉토리에서 Makefile을 수정한다.

#vi Makefile

obj-$(CONFIG_SKELETON) += skeleton.o //이 내용을 추가한다.

5. 커널을 다시 컴파일 한다. 이 때 skeleton 항목을 체크 한다.

#make mrproper

#make menuconfig

#make dep

#make zImage

Page 93: Embedded Linux 강좌

93

Embedded Linux 강좌

Device Driver를 커널에 포함시키기(3)

6. 타겟보드로 올릴 파일시스템에 장치파일을 만들어서 추가한 후에 파일시스템을 재전송한다.

#cd /root/XHYPER255A/Filesystem/root_xhyper/dev/

#mknod SKELETON c 230 0 // 메이저번호를 230으로 한다.

#cd ../../

#./r.sh

7. 만들어진 zImage 와 rootfs.img를 타겟보드에 전송한다.

8. 타겟보드로 부팅후에 커널에서 skeleton 장치를 지원하는지 확인한다.

#cat /proc/devices

230 skeleton …

9. application을 호스트 컴퓨터에서 컴파일한 후에 타겟보드로 전송을 하여 실행시킨다.

이것으로 디바이스 드라이버를 커널에 추가하는 방법을 알아보았다.

Page 94: Embedded Linux 강좌

94

Embedded Linux 강좌

Linux System Architecture

System Call InterfaceSystem Call Interface

Virture File System(VFS)Virture File System(VFS)

Buffer CacheBuffer Cache

ApplicationApplication

CharacterDevice DriverCharacter

Device Driver

HardwareHardware

Network SubsystemNetwork

Subsystem

Device InterfaceDevice Interface

Kernel Area

ApplicationArea

Hardware

BlockDevice Driver

BlockDevice Driver

Network Device Driver

Network Device Driver

BSD socketBSD socket

Inet(AF_INET)Inet(AF_INET)

Transport(TCP,UDP)

Transport(TCP,UDP)

Network(IP)Network(IP)

Page 95: Embedded Linux 강좌

95

Embedded Linux 강좌

Device driver 작성(1)

1. Host 터미널에서 device driver를작성한다.저는 host의 root/gpio/ directory에서 gpio.c와 gpio.h라는드라이버를작성한다.[host]# cd root[host]# cd gpio[host]# vi gpio.c

2. Make file을작성한다.같은 directory에 make file을작성한다.

[host]# vi makefile CC = armv4l-unknown-linux-gccINCLUDEDIR = /usr/includeCFLAGS = D__KERNEL__ -DMODULE –Wall –02CFLAGS += -I.. –I$(INCLUDEDIR)gpio.o: gpio.c

$(CC) $(CFLAGS) –c –o gpio.o gpio.o

Page 96: Embedded Linux 강좌

96

Embedded Linux 강좌

Device driver 작성(2)

3. Cross compile한다. (arm용 cross compiler로 compile)실행후 gpio.o file이생성된다

[host]# make

4. Host상의 gpio.o를 target 보드로다운로드한다. (ftp사용)minicom을 통해 접속된 target linux에서 host의 gpio.o를 가져가기 위해 먼저 target의 ifconfig를 통해 ip설정한 후 host ip 211.104.101.227로 ftp를 통해 접속한다. ftp가 동작하지않을 경우는 network환경을 다시 설정한다.

[target]# ifconfig eth0 211.104.101.228[target]# ftp 211.104.101.227

Login과 pass word를입력하여 host로접속한다. login : bunielpasswd : ******

Page 97: Embedded Linux 강좌

97

Embedded Linux 강좌

Device driver 작성(3)

5. Host의해당 directory로들어간다.Host에 있는 gpio.o를 target 보드의 현재 directory로 가져온다.

Ftp를 빠져 나온다.ftp>cd rootftp>cd gpioftp>get gpio.oftp>quit

6. Target 보드에서디바이스드라이버를적재한다.gpio.o모듈을 적재한다.

/proc/devices를 통해 적재된 디바이스의 주번호를 알아 온다.

mknod를 통해 Device의 위치, 디바이스 종류, 주번호 그리고 부번호를 등록한다.

에러없으면 이상없이 디바이스 드라이버가 적재됨을 알 수 있다. 그러면 다음은test program을 통해 이상없이 드라이버가 작성됐는지 확인 할 수 있다.

target]# insmod gpio.otarget]# cat /proc/devicestarget]# mknod /dev/GPIO c 253 0

Page 98: Embedded Linux 강좌

98

Embedded Linux 강좌

Device Driver Overview

Linux Kernel

Boot codeBoot code

int codeint code

Device Interface Table

blkdevs[] chrdevs[]blkdevs[] chrdevs[]

Set of RegistersSet of Registers

X_controller

dev1dev1 dev2dev2 dev3dev3

Interrupt

X_open()X_release()X_read()X_write()X_ioctl()X_int()X_init()

X_open()X_release()X_read()X_write()X_ioctl()X_int()X_init()

Q_open()Q_read()Q_ioctl()Q_write()Q_close()

Q_open()Q_read()Q_ioctl()Q_write()Q_close()

O_open()O_read()O_ioctl()O_write()O_close()

O_open()O_read()O_ioctl()O_write()O_close()

Y_open()Y_release()Y_read()Y_write()Y_ioctl()Y_int()Y_init()

Y_open()Y_release()Y_read()Y_write()Y_ioctl()Y_int()Y_init()

Z_open()Z_release()Z_readl()Z_write()Z_ioctl()Z_int()Z_init()

Z_open()Z_release()Z_readl()Z_write()Z_ioctl()Z_int()Z_init()

Page 99: Embedded Linux 강좌

99

Embedded Linux 강좌

12. Application 작성 및 실행과정

이번장은 앞장에서 작성된 device driver가 잘 동작되는지를 test 할 수 있는 프로그램을 작성한후 target board에서 동작시켜 확인하는 것을 목표로 한다.먼저 Host에서 test program code를 작성한 후 컴파일을 한다.이 때 사용되는 컴파일러는 arm용 cross compiler이다.Cross compiler에 PATH가 설정되어 있는지 확인한다.PATH가 설정되어 있지 않은 경우 별첨을 참조한다.Compile된 코드를 target 보드로 Downloading한 후 실행한다.

Module 적재Module 작성

Module compile

Host

Serial cable

Ethernet cross cableTarget 보드

Page 100: Embedded Linux 강좌

100

Embedded Linux 강좌

Application 작성(1)

1. Host 터미널에서 Application program을작성한다.저는 host의 root/gpio/ directory에서 test.c라는 응용프로그램을작성합니다.

(gpio test program source는별첨참조)[host]# cd root[host]# cd gpio[host]# vi test.c

2. Make file을작성한다.같은 directory에서 make file을작성한다.

[host]# vi makefileCC = armv4l-unknown-linux-gccINCLUDEDIR = /usr/includeCFLAGS = D__KERNEL__ -DMODULE –Wall –02CFLAGS += -I.. –I$(INCLUDEDIR)Test: test.c

$(CC) –o test test.c

Page 101: Embedded Linux 강좌

101

Embedded Linux 강좌

Application 작성(2)

3. Cross compile한다. (arm용 cross compiler로 compile)실행후 test 실행 file이생성된다.

[host]# make

4. Host에서 target 보드로 test를다운로드한다.앞장의 device driver 다운로드방법과동일하다.minicom을통해접속된 target linux에서 host의 test를가져가기위해먼저 target의 ifconfig를통해

ip설정한후 host ip 211.104.101.227로 ftp를통해접속한다. ftp가동작하지않을경우는 network환경을다시설정한다.

[target]# ftp 211.104.101.227

Login과 pass word를입력하여 login 한다. login : bunielpasswd : ******

Page 102: Embedded Linux 강좌

102

Embedded Linux 강좌

Application 작성(3)

5. Host의해당 directory로들어간다.Host에있는 tset를 target 보드의현재 directory로옮긴다.Ftp를빠져나온다.

ftp>cd rootftp>cd gpioftp>get testftp>quit

6. Target 보드에서 test program 을실행한다.Target 보드로가져온 test file의속성을실행가능파일로바꾼다.Test를실행하여 gpio device driver가제대로작동하는지확인한다.Test program의내용은구성된하드웨어의스위치를누른경우디바이스드라이버는

누른핀이하이상태인지 check한후하이상태이면해당핀의 bit값과누른버튼명을출력한다. (누른스위치와출력된버튼명이동일한경우이상없음을알수있다.)

target]# chmod +x testtarget]# ./test