커널 최초 컴파일 시험

커널을 포팅하기 전에 가장 먼저 커널 컴파일 옵션을 설정해 보고 한번 컴파일을 해 보아야 합니다.

 

이런 과정을 거치는 이유는 개발 환경을 검증하기 위한 목적이 가장 강합니다.

그런데 커널 컴파일 옵션을 생짜로 모두 설정하러 다니는 것이 그리 좋은 것이 아니죠..

가장 좋은 것은 누군가가 해 놓은 환경 설정을 내 환경에 맞추는 것이 좋아요..

 

자 1 차 목표는 EZ-S3C2440 이었죠…

 

그런데 ..

 

리눅스 커널 소스에서 암 용 커널 환경 설정들이 있는 곳이 여기입니다.

linux/arch/arm/configs/

이중에 이런 파일이 있네요…

s3c2410_defconfig

흐흐흐…

그래서

작전을 변경했습니다.

 

자 1 차 목표를 EZ-S3C2410으로 하기로

흐흐흐

 

앗 약속이 틀리다구요?

하하하..

제 맘입니다.

거저 먹을 수 있는 찬스를 전 놓치기 싫지요..

 

자 이제 시작해 봅시당


환경 설정 및 커널 컴파일



이미 작업해 놓은 커널 컴파일 옵션을 적용하는 것이 그리 어려운 것이 아닙니다.

 

적용전에 우선 Makefile을 약간 손보아야 합니다.

 

커널소스 linux\Makefiel 에서 193 라인 쯤에 가면 크로스 컴파일을 위한 처리 부분이 있습니다.

193 ARCH            ?= $(SUBARCH)
194 CROSS_COMPILE   ?=


이 부분을 arm 용 크로스 컴파일이 될 수 있도록 다음과 같이 고칩니다.

193 ARCH            ?= arm
194 CROSS_COMPILE   ?= arm-linux-


193 라인의 ARCH 는 실제로 리눅스 소스상에 어떤 아키텍쳐 소스를 참조할 것인지등과 같은 컴파일 과정에 영향을 미칩니다.

 

예로 보면 linux/arch 하부 디렉토리에는 arm 이라는 디렉토리가 있습니다. 이를 지정하기 위한 경우가 그 한 예죠.

 

194 라인은 gcc 컴파일의 앞부분에 붙은 접두사입니다.

 

원래 i386 네이티브 컴파일러라면 앞에 특별히 접두사가 붙지 않습니다.

하지만 arm 이라면 다르죠

 

이건 어떤 크로스 컴파일러를 설치했고 해당 크로스 컴파일러의 접두사가 어떤 형태인가에 달라지는 겁니다.

저희 회사에서 제공하는 크로스 컴파일러라면 앞에 arm-linux- 가 붙습니다.

 

만약 EZ-AU1250 모델과 같은 mips 용 크로스 컴파일러라면 앞에 mipsel-linux- 같은 형태로 붙게 됩니다.

 

어쨌든 이렇게 수정한 후 다음과 같은 명령을 사용해서 소스를 청소해 줍니다. 

[root@localhost linux]# make mrproper
  [root@localhost linux]# make distclean

mrproper  는 이전에 설정한 정보를 지우거나 새로운 커널 소스를 가져다 컴파일 할 때에 사용합니다. 이전 커널을 컴파일할 때 만들어진 오브젝트 파일(*.o)과 의존성 설정, 컴파일 환경 설정값, 버전 정보 등 새로 시작하는 컴파일에 영향을 주는 이전 정보들을 삭제합니다.

이전에 설정된 컴파일환경을 재사용한다면 이 명령을 수행할 필요는 없습니다.

 

distclean은 리눅스 커널소스인 .tar.gz 를 풀었을 때와 같은 상태로 만들어 주는 겁니다.

 

어찌 되었든 이 두 과정을 거쳐서 소스를 깨끗한 상태로 만든 후 다음 명령을 쳐서
S3C2410 컴파일 옵션 설정 상태로 만들어 버립니다.

[root@localhost linux]# make s3c2410_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
[root@localhost linux]#


 자 이제 어떻게 설정되어 있나 잠깐 들여다 봅시다.

 

make menuconfig 명령을 쳐서 커널 환경 설정 작업 상태로 들어 갑니다.

[root@localhost linux]# make menuconfig

A006_001_kernel_option.png

 

여기서 System Type 을 선택합니다.
 

A006_002_kernel_option_system_type.png 

시스템 타입 설정에 S3C2410 이 보이죠?

일단은 제대로 환경 설정이 된거죠..

 

이제 컴파일 해 봅시다.

 

컴파일은 arm 의 경우라면 make zImage 입니다.

 

[root@localhost linux]# make zImage
     :
SYSMAP  .tmp_System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  AS      arch/arm/boot/compressed/head.o
  GZIP    arch/arm/boot/compressed/piggy.gz
  AS      arch/arm/boot/compressed/piggy.o
  CC      arch/arm/boot/compressed/misc.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
[root@localhost linux]#


위와 같은 메시지가 나오면 정상적으로 컴파일이 끝난 겁니다.

생성된 커널 이미지는 arch/arm/boot/zImage 파일이 되겠습니다.

이렇게 해서 생성된 이미지를 부트로더를 이용해서 보드에 올리면 되는데

 

문제는!

 

이것이 제대로 동작할 것이라고 믿을 수는 없다는 겁니다..
재수 좋으면 동작 할 것이고
재수 없으면 동작 안 할겁니다.

복불복이라고나 할까?

여러분의 보드가 배신할지 모르기 때문입니다.