안녕하세요. MAKUS 이우영 입니다.


오늘은 ZYNQ에 올라갈 kernel 을 만들어 볼려고 합니다.

kernel 이 동작하기 위해서는 부트로더가 필요합니다. 

부트로더는 많이 사용하는 u-boot 입니다.


두 작업 모두 linux 작업환경에서 가능합니다.

저는 ubuntu 12.04 64bit 환경에서 진행을 하였습니다.



Cross Compiler 설치



u-boot나 kernel 모두 ARM에서 동작을 하기 때문에 build를 하기위해서는 cross compiler가 필요합니다.

cross compiler를 설치하기 위해서는 방법이 여러가지 있습니다.
대표적으로 Xilinx에서는 peralinux 라는 개발환경을 제공하고 있습니다.
다른 방법으로는 cross compiler만 따로 설치하는 방법입니다.

오늘은 cross compiler만 따로 설치해서 진행을 할 예정입니다.

아래 링크를 따라가면 cross compiler 설치 파일이 있습니다.

https://code.google.com/p/zedboard-book-source/downloads/detail?name=xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin&can=2&q=

xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 파일을 받으시면 됩니다.

설치 방법은 다음 링크를 보시면 쉽게 따라서 설치가 가능합니다.

http://embedded.kleier.selfhost.me/xilinx_sourcery.php

!주의사항
ubuntu의 기본 쉘은 dash를 사용중입니다. 이 쉘을 bash로 변경해야만 설치가 가능합니다.
dash 를 bash로 변경하는 방법은 간단합니다.

# sudo dpkg-reconfigure -plow dash

이후 NO 를 선택해 줍니다.


u-boot, kernel Build



Xilinx에서는 소스코드를 git를 통해서 배포하고 있습니다.

먼저 git를 설치해 줍니다.

# sudo apt-get install git

설치가 끝나면 소스코드를 받아보겠습니다.

# git clone https://github.com/Xilinx/u-boot-xlnx.git
# git clone https://github.com/Xilinx/linux-xlnx.git

다운로드가 끝나면 다음과 같이 폴더가 생성됩니다.

# du -sh * 
1.6G   linux-xlnx 
158M  u-boot-xlnx

소스코드를 받았으니 Build를 해보겠습니다.
그전에 설정부터 하겠습니다.

# export ARCH=arm
# export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
# export PATH=/opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH
 
설정이 잘되었는지 --version 을 통해 확인합니다.
 
# arm-xilinx-linux-gnueabi-gcc --version
arm-xilinx-linux-gnueabi-gcc (Sourcery CodeBench Lite 2011.09-50) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

!주의사항
64bit ubuntu를 사용중이라면 파일을 못찾는 경우가 생깁니다. 
이런경우 다음 페키지를 설치해야 합니다.

sudo apt-get install ia32-libs


설정이 완료되었으면 u-boot 부터 진행을 하겠습니다.

# cd u-boot-xinx

파일 중 boards.cfg 라는 파일이 있습니다.
이 파일에는 현재 u-boot가 지원하는 보드에 관하여 적혀있습니다.
열어서 zynq를 검색해보면 다음과 같이 나옵니다.

01.png

디양한 설정이 있지만 자신에게 맞는 설정을 선택해야 합니다.
저는 ZC_702보드를 사용중이기 때문에 zynq_zc70x를 사용하겠습니다.

# make zynq_zc70x_config
Configuring for zynq_zc70x board...
 
설정이 되었습니다.
그럼 Build를 해보겠습니다.
 
# make
 
Build 완료 후 확인해보면 다음과 같은 파일들이 추가 되었습니다.
  
# ll u-boot*
-rwxrwxr-x 1 woody woody 1575142  6월 24 16:57 u-boot*
-rw-rw-r-- 1 woody woody  339428  6월 24 16:57 u-boot.bin
-rw-rw-r-- 1 woody woody  339492  6월 24 16:57 u-boot.img
-rw-rw-r-- 1 woody woody    1191  6월 24 16:57 u-boot.lds
-rw-rw-r-- 1 woody woody  312828  6월 24 16:57 u-boot.map
-rw-rw-r-- 1 woody woody 1018378  6월 24 16:57 u-boot.srec
 
이많은 파일 중 우리가 필요한 파일은 u-boot 입니다.
다만 이름을 꼭 u-boot.elf로 변경 한 이후에 사용해야 합니다.
 
그럼 다음으로 kernel 입니다.
 
# cd ../linux-xlnx/
 
여기서는 설정파일이 복잡한 곳에 있습니다.
 
# ll arch/arm/configs/xilinx*
-rw-rw-r-- 1 woody woody 6150  6월 24 16:36 arch/arm/configs/xilinx_zynq_apf_defconfig
-rw-rw-r-- 1 woody woody 6566  6월 24 16:36 arch/arm/configs/xilinx_zynq_defconfig

xilinx_zynq_defconfig 파일을 이용하면 될것으로 보입니다.
여기도 u-boot와 같이 make 를 통해 설정을 합니다.

# make xilinx_zynq_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

설정이 완료되면 다시 make를 통해 진행 합니다.

# make UIMAGE_LOADADDR=0x8000 uImage

다음과 같이 에러메시지가 나온다면  mkimage를 설치 해주셔야 합니다.

"mkimage" command not found - U-Boot images will not be built
 
# sudo apt-get install uboot-mkimage
 
Build가 끝나면 이미지는 다음 위치에 있습니다.
 
# ll arch/arm/boot/
합계 13416
drwxrwxr-x  5 woody woody    4096  6월 24 17:21 ./
drwxrwxr-x 88 woody woody    4096  6월 24 16:36 ../
-rw-rw-r--  1 woody woody     114  6월 24 17:18 .Image.cmd
-rw-rw-r--  1 woody woody      46  6월 24 16:36 .gitignore
-rw-rw-r--  1 woody woody     212  6월 24 17:21 .uImage.cmd
-rw-rw-r--  1 woody woody     141  6월 24 17:18 .zImage.cmd
-rwxrwxr-x  1 woody woody 6685036  6월 24 17:18 Image*
-rw-rw-r--  1 woody woody    3148  6월 24 16:36 Makefile
drwxrwxr-x  2 woody woody    4096  6월 24 16:36 bootp/
drwxrwxr-x  2 woody woody    4096  6월 24 17:18 compressed/
drwxrwxr-x  3 woody woody   28672  6월 24 16:36 dts/
-rw-rw-r--  1 woody woody    1648  6월 24 16:36 install.sh
-rw-rw-r--  1 woody woody 3488048  6월 24 17:21 uImage
-rwxrwxr-x  1 woody woody 3487984  6월 24 17:18 zImage*

kernel 이미지 파일은 3가지 종류로 나옵니다.
Image, uImage, zImage 중 u-boot용인 uImage를 사용합니다.

여기까지가 부팅에 필요한 u-boot.elf와 uImage 만든는 방법이였습니다.
ZYNQ를 부팅하기위해서는 중요한 마지막 작업이 남아있습니다.

바로 DeviceTree 입니다. 이부분은 다음시간에 하도록 하겠습니다.

감사합니다.