< Kernel 컴파일 및 fusing >

지난 시간에는 부트로더를 올리고, 부트로더에서 제공하는 command들의 사용법을 알아보았다. 이번 시간에는 홈페이지에서 커널 소스를 다운받아 컴파일하고 생성된 이미지를 지난시간에 사용했던 tftp와 시리얼을 이용해 타겟보드에 올려본다. 또, 커널 컴파일을 하기 전에 “환경 설정 인터페이스”를 통해 네트워크 디바이스 모듈을 제외하고 컴파일을 하였을 때 해당 커널이 어떻게 작동하는지 알아본다.

홈페이지에서 다운받은 linux-2.4.19-pro3_usb20_v33.tar.gz 파일의 압축을 해제한다.

# tar xvfz linux-2.4.19-pro3_usb20_v33.tar.gz

압축을 풀면 [ linux-2.4.19-pro3_usb20 ] 이란 디렉토리가 생성된다.

# cd linux-2.4.19-pro3_usb20

# make dep

해당 디렉토리로 들어가 의존성 검사를 수행한다.

에러가 발생하지 않았다면 커널 이미지를 만드는 명령을 실행한다.

# make zImage

커널 이미지인 zImage는 /linux-2.4.19-pro3_usb20/arch/arm/boot 디렉토리에 생성된다.

zImage가 생성되었으면 지난 시간에 실습했듯 부트로더에서 tftp나 시리얼 케이블을 이용하여 커널이미지를 타켓보드에 올린다.

# cp zImage $PROJROOT/images	=> 타겟으로 복사할 이미지를 저장

# cp zImage /tftpboot	=> tftp로 전송할 경우 지정 디렉토리에 저장

=============================< 참   고 >===============================

<> IP 어드레스 할당방법

boot> set ip_addr

Newhostip : 192.168.1.101

Newtargetip : 192.168.1.102

한번 설정된 값은 Flash에 저장되어 다시 반복하여 설정하지 않아도 된다.

< tftp를 이용한 image download >

FTP보다 간단하지만 기능이 조금 덜한 네트워크 어플리케이션이다. 이것은 사용자 인증이 불필요하고 디렉토리를 보여주지 않아도 되는 곳에 사용한다. TCP대신 UDP를 사용한다.

1) rpm -qa | grep tftp

tftp가 설치되어 있는지 확인한다.

2) setup    // 아래와 같은 화면에서 tftp를 선택한 후 [확인]을 누른다.

3) vi /etc/xinetd.d/tftp     // 아래와 비교하여 수정한다.

4) service xinetd restart

tftp서비스 및 관련서비스를 재시작한다.

4) 호스트의 / 디렉토리에 /tftpboot라는 디렉토리가 있는지 확인하고 없으면 만들어 준다.

5) 커널 이미지인 zImage를 /tftpboot에 복사한다.

6) 타겟보드에서 tftp zImage kernel 을 실행한다.

< 시리얼을 이용하여 파일을 다운로드 받는 법 >

= 타겟보드의 경우 =

boot> download kernel

타겟보드에서는 다운로드 대기상태로 진입한다. 호스트에서 커널이나 그 외의 다른 이미지를 전송해주어야 시리얼을 통해 데이터 전송이 시작된다.

= PC(호스트)인 경우 =

uuencode zImage zImage >/dev/ttyS0

uuencode라는 명령으로 데이터를 전송하는데 처음 zImage는 호스트 PC에 있는 데이터로 전송을 원하는 파일이름을 정의하며, 호스트 PC의 COM1 포트에 관한 디바이스 노드인 /dev/ttyS0를 통해 전송된다.

======================================================================

커널 이미지(zImage)가 타겟보드에 다운로드되면 Flash에 올려준다.

# erase 80000 180000	// 우선 커널영역을 지워준다.

# flash kernel

이상은 일반적인 커널의 컴파일 및 퓨징 방법을 설명하였다.

그러나 위의 커널 컴파일은 이미 휴인스 PXA255-PRO 보드에 맞게 환경이 설정되어 있다.

아래에서는 환경설정 인터페이스를 이용해 자신이 원하는 것에 따라 알맞게 커널 컴파일 설정을 할 수 있는 방법을 알아본다.

< Kernel Configuration >

리눅스의 여러 가지 모듈 가운데 Network device module을 제외하고 커널 컴파일을 하려 한다. 네트워크 디바이스 모듈이 적재되지 않은 상태의 커널 이미지가 어떻게 작동하는지 알아보자.

커널 소스가 있는 폴더로 이동한다.

# make menuconfig

메뉴 방식의 화면에서 단축글쇠와 방향키로 메뉴 사이를 옮겨 다닐 수 있다.

“--->”표시가 있는 곳에서 엔터를 누르면 하위메뉴로 이동하고 <ESC>를 두 번 누르거나 <EXIT>를 선택하면 상위 메뉴로 이동한다. <h>는 도움말, <tab>은 콘트롤 사이를 옮겨다닐 수 있다.

질문에 대해

Y : 커널에 포함          N : 커널에서 제외         M : 모듈

Main Menu 화면이 보이면 11번째 항목인 [ Network device support ] 항목을 선택한다.

[ ] Network device support

‘*’가 체크되어 있다면 스페이스바를 눌러 체크를 풀어준다. (공백으로 남김)

Main Menu로 돌아와 [ Exit ]을 선택하면

Do you wish to save your new kernel configuration?

<Yes>    <No>

위와 같이 커널 설정의 저장을 묻는 메뉴가 나타나고 <Yes>를 선택하면 성공적으로 menuconfig 설정이 완료된다.

menuconfig 설정을 마치고 일반적인 커널 컴파일 할때와 마찬가지로

# make zImage

명령을 실행하면 네트워크 디바이스 지원이 제외된 커널을 컴파일하고 이미지를 생성하게 된다.

위의 이미지를 타겟보드에 올리고 네트워크 디바이스를 지원하는 커널과 지원하지 않는 커널이 어떤 차이점이 있는지 알아보자.

# ifconfig eth0 192.168.100.100

네트워크 디바이스를 제외한 커널에서는 not found device 라는 메시지가 뜨고,

네트워크 디바이스를 포함한 커널에서는 IP가 정상적으로 설정된다.

<< 부 록 >>

Network device Support :

이더넷 디바이스와 PPP(전화선을 이용한 다이얼업 네트워크), SLIP(전화선을 이용한 다이얼업 네트워크), PLIP(패러랠포트를 이용한 네트워크) 등 네트워크 장치들을 지원합니다. 리눅스 박스가 네트워크에 연결되려면 반드시 [Y]를 선택합니다.

ARCnet Support :

ARCnet 칩셋이 있는 네트워크 카드를 가졌다면 [Y]를 선택합니다. 아크넷은 전송률이

낮지만(2.5Mbps) 케이블이 훨씬 길어질 수 있어 공장 등에서 사용되기도 합니다. 잘

모르겠으면 [N].

< > ARCnet support

< > Enable standard ARCNet packet format (RFC 1201) (NEW)

< > Enable old ARCNet packet format (RFC 1051) (NEW)

< > Enable raw mode packet interface (NEW)

...생략

Dummy net driver Support :

Dummy net driver는 패킷을 버리는 쓰레기통 (bit-bucket)입니다. PPP나 SLIP을 사용한다면

[Y]나 [M]을 답합니다. 모듈로 컴파일하면 더미 터미널 여럿을 동시에 사용할 수 있습니다.

어떻게 설정하더라도 커널 크기는 늘어나지 않습니다. [M]을 권장합니다.

Bonding driver support :

"bond" 다중 이더넷 채널을 사용하려면 [Y]나 [M]을 답합니다. SISCO에서는 이 것을

"Etherchannel"이라 부르며, Sun에서는 "Trunking", 리눅스에서는 "Bonding"이라 부릅니다.

여러분이 어떤 다른 컴퓨터에 이더넷 연결을 두 개 가지고 있다면, 이 드라이버를 이용해서

두 배 속도를 가진 하나의 장치처럼 동작하도록 만들 수 있습니다. 여러분의 리눅스 박스와

연결 된 저쪽 머신도 리눅스 Bonding이나 Cisco 5500 switch, 혹은 SunTrunking SunSoft

driver처럼 이와 비슷한 기능을 지원해야 합니다. EQL 드라이버와 비슷하지만 시리얼 라인

대신 이더넷 세그먼트를 합칩니다. 잘 모르겠으면 [N].