타겟보드상에 올릴 드라이버를 컴파일 하기 위해서는 타겟용 커널을 컴파일 해두어야 한다.
(2.4는 잘 모르겠으나 적어도 2.6에서는 그렇다.)

기존 개발 환경은 페도라 코어6를 사용 했었는데 무리가 없었으나
아름다운 인터페이스를 자랑하는 우분투에서 타겟보드를 개발하고자 한다면 몇가지 수정되어야 할 것들이 있다.

그중에 하나가 커널 컴파일시 발생되는 PATH_MAX 오류...
오류내용을 살펴보면 script/mod/sumversion.c 에서 PATH_MAX가 무엇인지 모르겟다는 것인데,
이는 최근 버전의 리눅스에서 발생되는 라이브러리 관련 오류이다.

해결 법으로는 라이브러리 중복 설치와 코드 수정 두가지 방법이 있는데

라이브러리 중복 설치는 다른 문제를 야기 시킬수도 있으므로
sumversion.c파일의 소스를 수정 하는 것이 바람직 하다.

"script/mod/sumversion.c" 파일 상단 내용 중...
 // 생략...
 #include <string.h>
 #include "modpost.h"
 // 생략...

위의 소스를 아래와 같이 limits.h 파일을 추가 시켜 준다.
 // 생략...
 #include <string.h>
 #include <limits.h>
 #include "modpost.h"
 // 생략...

이렇게 해도 오류가 난다면
 #include <linux/limits.h>

위 내용을 추가 시켜 준다.
Posted by Hugh.Kim

편의상 Huins에서 제공하는 CD 6.0을 기준으로 동봉된 이미 컴파일 된 파일로 하겠다.

기존 2.4에서는 부트로더로 BLOB를 사용하였고 tftp를 이용하여 zImage파일을 로드하여 flash메모리에 적재했다.
하지만 2.6에서는 부트로더는 u-boot라는 먼가 생소한(아직 정확하게 무엇인지는 모른다)부트로더를 사용한다.
사용법은 비슷한듯 하지만 BLOB에서 2.6커널을 zImage로 올리려고하니 커널 영역으로 할당된 플래시 메모리가 작아 올라가지 않는것~!!!

집에 패러럴포트도 없는 지라 JTAG을 이용하여 부트로더를 새로 올리는 것도 불가능....
고민 끝에 이미 올라와 있는 BLOB를 이용하여 u-boot를 올려보기로 했다.

생각보다 blob로 부트로더를 올리는 것은 어렵지 않았다.

 boot>tftp u-boot.bin blob
 ...
 boot>flash blob
 ...
 boot>reboot
(이 작업을 위해선 당연히 호스트의 tftpboot디렉터리에 u-boot.bin파일을 올려두어야 한다.)

리부트시키면... 너무 간단히도 새로운 부트로더가 실행됨을 알수 있다.

기존의 ip설정으로 맞추기 위해,
 PRO3>set serverip 192.168.1.100     // 호스트 IP설정
 PRO3>set ipaddr 192.168.1.99     // 타겟 IP설정
 PRO3>setenv     // 설정값 기록

시디의 Image디렉터리의 내용을 /tftpboot/pxa255_pro3 에 복사해두고 , 각각 kernel과 파일시스템을 올린다.
 PRO3>run linuxf
 ...
 PRO3>run rootf
 ...

파일시스템의 경우 꽤 긴시간이 걸리므로 여유있게 기다리는 것이 좋다.

run 명령으로 위와같은 인자값을 주면 자동적으로 /tftpboot/pxa255_pro3 에서 해당 파일을 찾아 다운로드하고,
플래시에 기록까지 하게 된다.

여기 까지 완료 되었다면 마지막으로 다음 명령을 입력하여 kernel로 진입한다. 
 PRO3>boot
Posted by Hugh.Kim
Embeded Study/Linux Kernel2009. 8. 24. 18:39
운영체제에 있어서 핵심이라 불릴수 있는 부분이 바로 Kernel이다.
가장 많이 사용되는 윈도우에도 커널이 있으며 오픈소스로 유명한 리눅스에도 커널이 있다.

커널이란 하드웨어와 직접 통신 하는 부분으로 시스템 서비스나 사용자간의 매개체 역할을 하게 된다.
커널을 공부하기 위해선 소스가 공개되어있으면서도 높은 완성도를 보이는 리눅스를 고르는 것이 좋은데
대부분의 리눅스 커널 도서들은 레드햇 기반으로 작성 되어있다.

물론 레드햇 계열인 레드햇 리눅스나 페도라로 공부해도 좋겠지만,
필자는 이미 우분투의 매력에 흠뻑 젖었을 뿐 아니라 그나마 익숙해진 상태라
조금더 이해하면서 공부해 보고자 레드햇 책을 보면서 이것을 우분투에 적용시켜가면서 공부해볼 생각이다.

이 글은 그 내용을 정리한 것으로 강좌도 아니며 그저 개인적인 노트 정도로 보면 되겠다.

현재 환경은 우분투 9.04를 노트북에서 작동시키도 있으며, 커널 버전은 2.6.28 이다.

우분투는 앞서 말한바와 같이 데비안 계열의 리눅스로 패키지 관리가 잘된다는 점이 장점이다.
이것은 커널 컴파일시 차이점을 보이는데 여타 리눅스는 커널 이미지를 만들어 부트로더에 이미지를 불러 오도록함으로서 부팅이 되도록 했으나 우분투는 deb패키지로 결과물이 나오며 이것을 설치함으로써 커널이 시스템에 적재되게 된다.

커널을 컴파일 하기 위해서 몇가지 도구가 필요하다.

터미널을 열어 다음을 입력하여 패키지를 설치한다. 참고로, 터미널 상의 작업은 모두 슈퍼유저(su)에서 이루어진다.

 apt-get install build-essential kernel-package
이들은 커널 컴파일에 필요한 헤더와 패키지 파일 생성에 필요한 것들이다.

 apt-get install libncurses5-dev libqt3-mt-dev
이것은 커널 설정을 하기위한 것으로 각각 menuconfig와 xconfig를 사용하기 위함이다.

설치전에 현재 커널 버전을 알 필요가 있는데
 uname -r
위 명령으로 커널 버전 확인이 가능하다.

다음으로 커널 소스를 받아야 하는데 보통은 http://kernel.org에서 다운 받지만
우분투의 호환이 잘 되기 위해선 다음과 같이 apt-get이나 시냅틱으로 다운 받도록 한다.
 apt-get install linux-source

설치가 완료되면 압축을 풀어주어야하는데 통상적으로 커널 소스는 '/usr/src/'에 위치하고 있다.
 cd /etc/src
 ls -al
 tar xvfj linux-2.6.28.tar.bz2

압축이 풀리면 일단 소스 디렉터리를 심볼릭링크를 걸고 그 디렉터리로 이동한다.
 ln -s linux-source-2.6.28 linux
 cd linux

이미 컴파일된 바이너리 파일들을 초기화 하려면 다음을 입력하면된다.
 make-kpkg clean

컴파일을 하기 전에 설정을 먼저 해주어야 하는데 이미 설치된 커널의 설정을 그대로 유지하려면 '/boot/config-버전'의 파일을 복사한 뒤 설정 화면으로 이동하면 된다. 'config-'뒤의 버전은 'uname -r'명령으로 나온 내용을 입력하면 된다.
 cp /boot/config-2.6.28-15-generic ./.config
 make menuconfig

설정화면에서 추가할 기능과 제거할 기능을 고른 뒤 화면을 빠져나온다.

컴파일을 하려면 다음을 입력한다.
 make-kpkg --initrd kernel_image kernel_headers modules_image -append-to-version=.test
'-append-to-version'은 기본 버전 뒤에 붙는 문자를 지정하는 것이다.

상위 디렉터리로 이동하면 새로 생성된 image 패키지와 header 패키지를 확인 할수 있다.
'dpkg -i [패키지명]'명령을 이용하여 두 패키지를 설치한 뒤 재부팅하면 grub메뉴에서 새로 설치된 커널을 확인할 수있으며
부팅이 가능하다.


Posted by Hugh.Kim