2009. 9. 2. 16:00

순대보드 Kernel Image



저번 시간까지 해서 'uboot 포팅'까지 완료되었다. uboot를 통해서 리눅스, WinCE와 같은 운영체제를 올릴 수 있는 기반이 준비된 것이다.

이번에 할 일은.. AHAV9302 순대보드에 올릴 리눅스 커널을 만들것이다.

일단 순대국밥님 강좌에 있는대로 Linux Kernel 2.6.22.8 을 올릴 것이고, ftp://ftp.kernel.org에 들어가서 해당 버전의 리눅스 커널을 /opt/arm9sbc/ahav/backup 디렉토리에 다운로드 받는다.
$ wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.8.tar.bz

커널 작업을 하기 위해서 아래와 같이 /opt/arm9sbc/ahav/kernel 디렉토리에 압축을 푼다.
$ cd ${AHAV_KERNEL_DIR}
$ tar -C ${AHAV_KERNEL_DIR} -xjf ${AHAV_BACKUP_DIR}/linux-${AHAV_KERNEL_VER}.tar.bz2

AHAV9302의 리눅스 커널과 네트웍 포팅을 위해 디렉토리 하나를 추가 생성한다. 나중에 파일시스템 관련해서 꼭 필요한 부분이란다. 미리 만들어 준다.
$ mkdir -p ${AHAV_HOST_DIR}/${AHAV_KERNEL_VER}
$ ln -s ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}/include
          ${AHAV_HOST_DIR}/${AHAV_KERNEL_VER}/include

압축을 해제한 리눅스 커널에서 수정하거나 새로 생성해야하는 파일에는 다음과 같은것들이 있다.
[U] 는 기존의 파일을 수정할 것이고, [N] 은 새로 생성해 주어야 하는 파일을 명시한 것이다.
    [U] arch/arm/mach-ep93xx/Kconfig
    [U] arch/arm/mach-ep93xx/Makefile
    [U] arch/arm/mach-ep93xx/Makefile.boot
    [N] arch/arm/mach-ep93xx/ahav9302.c
    [U] arch/arm/tools/mach-types
    [U] include/asm-arm/arch-ep93xx/hardware.h
    [U] include/asm-arm/arch-ep93xx/memory.h
    [N] include/asm-arm/arch-ep93xx/ahav9302.h
    [U] arch/arm/kernel/setup.c
    [U] arch/arm/boot/Makefile

커널 머신(kernel machine) 선택메뉴(arch/arm/mach-ep93xx/Kconfig)에 AHAV를 선택할 수 있는 메뉴를 추가한다.
$ vi arch/arm/mach-ep93xx/Konfig

Makefile에도 새로운 커널 머신이 추가 되었다는 것을 알려주어야 한다. arch/arm/mach-ep93xx/Makefile 파일을 열어 마지막 부분에 아래와 같이 한줄을 추가한다.
$ vi arch/arm/mach-ep93xx/Makefile

다음은 AHAV9302의 SDRAM 연결을 참조하여 arch/arm/mach-ep93xx/Makefile.boot 의 커널 시작주소를 수정한다. 앞서 말한 적이 있지만 AHAV9302 보드에서 SDRAM의 메모리 맵 주소는 0xC0000000이다.
$ vi arch/arm/mach-ep93xx/Makefile.boot


이제부터는 타겟보드인 AHAV9302에 관련된 파일을 생성해서 작업을 할것이다. 무작정 처음부터 새로 생성해서 하는 것보다 기존에 있는 동일한 혹은 비슷한 칩에대한 파일을 구해서 수정을 하는 것이 정신건강에 좋다고 한다.
"arch/arm/mach-ep93xx/"
디렉토리의 "edb9302.c" 파일을 복사해 "ahav9302.c" 를 만들어 수정하면 된다.
순대국밥님이 미리 수정해 놓은 파일을 사용해도 된다. edb9302.c를 ahav9302.c에 맞게 수정한 파일인데, 두 파일을 비교해보는 것도 좋을 듯 하다. 얼핏 봐서는 이더넷 관련 부분이 추가된듯 하다.

다음은 uboot에서도 살펴본듯한 머신타입(arch/arm/tools/mach-types) 파일에 ahav9302 관련된 부분을 넣어준다.
$ vi arch/arm/tools/mach-types

"include/asm-arm/arch-ep93xx/hardware.h"의 마지막에 새로 생성할 ahav9302.h를 포함시킨다.
$ vi include/asm-arm/arch-ep93xx/hardware.h

SDRAM의 시작주소가 0xC0000000 부터 시작되고 있으니 "include/asm-arm/arch-ep93xx/memory.h" 의 PHYS_OFFSET을 아래와 같이 0xC0000000으로 변경한다.
$ vi include/asm-arm/arch-ep93xx/memory.h

"include/asm-arm/arch-ep9302xx/ahav9302.h" 파일은 현재로썬 별 내용이 없기에 그냥 빈 파일로 만들어 두면 된다. 후에 하드웨어를 구현하면서 필요한 선언들을 넣어주는 용도로 사용하면 된다.

AHAV9302 가 64MB 이므로, "arch/arm/kernel/setup.c" 파일의 42번째 줄에서 MEM_SIZE를 (16*1024*1024)에서 (64*1024*1024)로 변경을 해주어야 한다.
$ vi arch/arm/kernel/setup.c

"arch/arm/boot/Makefile"
의 64 번째 줄에 있는 부분을 아래와 같이 변경한다.
이전의 uboot 포팅에서 만들어진 /usr/bin/mkimage가 여기서 사용된다. 커널이 적재되어야 할 주소를  미리 지정해 놓고, 압축이 풀리는 곳의 지정을 다르게 하여 좀 더 효율적으로 한다는데.. 아직 이해 부족.. -_-
$ vi arch/arm/boot/Makefile


자!! 이제부터 커널 컴파일이다.

컴파일 하기 위해서 커널의 설정을 해주어야 하는데.. 음.. 아직 잘 모르겠어.. ㅡ.ㅜ
다행히 순대국밥님이 커널 설정에 대한 컨피그 파일을 미리 준비해 주셨다. 그 놈을 사용해서 커널 컴파일을 하면 될 듯 하다.
위의 파일을 받아서 linux-2.6.22.8 디렉토리로 복사하고, 파일 이름을 .config 라는 이름으로 바꾸어 준다.
아래의 명령을 사용해서 생성하려는 커널의 설정에 대해 확인할 수 있다.
$ cd ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}
$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

아래의 명령을 사용해 AHAV9302의 리눅스 커널을 컴파일 하자!!
clean은 기존의 것들을 지우고 모두 새로 컴파일을 하겠다는 것이고, uImage는 /usr/bin/mkimage를 이용해서 커널을 uboot Image로 만들겠다는 뜻이다.
$ make ARCH=arm CROSS_COMPILE=arm-linux- clean
$ make ARCH=arm CROSS_COMPILE=arm-linux- uImage

한참을 컴파일을 할 것이다.
정상적으로 컴파일이 되었다면 "arch/arm/boot/"에 커널이미지(uImage)가 생성되었을 것이다.

이 녀석을 다음 작업을 하기위한 경로로 이동을 시키자!!
$ cp ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}/arch/arm/boot/uImage  
       ${AHAV_KERNEL_DIR}/.post/.
$ cp ${AHAV_KERNEL_DIR}/.post/uImage ${AHAV_IMAGES_DIR}/${AHAV_PROJECT_NAME}/.

이렇게 해서 AHAV9302 순대보드를 위한 리눅스 커널은 준비가 된 것이다.

이해 못할 부분들이 많이 있는데.. 일단 따라해보며 순대보드에 리눅스를 올리는 것까지 한 번 해보고, 필요한 부분들을 찾아가며 다시 공부를 해봐야 할 듯 하다.
무작정 하면 첨부터 완전 질려버려 아무것도 못할 듯... -_-;


'혼자서 놀기... > 순대보드(AHAV9302)' 카테고리의 다른 글

순대보드 u-boot - 4  (0) 2009.09.02
순대보드 u-boot - 3  (0) 2009.08.11
순대보드 u-boot - 2  (0) 2009.08.11
순대보드 u-boot - 1  (4) 2009.04.02
순대보드 CrossCompile 환경 - 2  (0) 2009.04.01