누구나 쉽게 배우는 임베디드 리눅스④
작성자 정보
- 웹관리자 작성
- 작성일
컨텐츠 정보
- 17,159 조회
- 0 추천
- 목록
본문
누구나 쉽게 배우는 임베디드 리눅스④
커널을 올려보자
이제 드디어 강좌의 핵심인 리눅스 커널을 올려볼 시간이 되었다.
SMDK2440보드를 기준으로 하여 타겟에 리눅스 커널을 올리고,
실행해 보기까지의 과정을 중점적으로 살펴보기로 한다.
글 _ 장영준 삼성전자 SW연구소 Linux Technology Group 선임 연구원
연재 순서
① 임베디드 리눅스 첫 걸음마
② 교차 개발 환경을 구축하자
③ 부트로더 설정은 이렇게
④ 커널을 올려보자
⑤ 루트 파일 시스템은 어떻게 구성되는가
⑥ 2% 부족함을 채워보자
커널 다운로드
리눅스 커널은 http://kernel.org 사이트에서 버전인 2.6.23.9 를 기준으로 설명한다.
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.9.tar.bz2
# tar -xjf linux-2.6.23.9.tar.bz2
# cd linux-2.6.23.9
빌드 환경 설정
커널을 빌드할 위치는 피시(호스트)인데, 커널을 적재하여 실행할 보드(타겟)는 SMDK2440 보드이다.
따라서 SMDK2440 보드에 적재하기 위한 이미지를 생성하기 위해 크로스 빌드를 해야 하는데, 이는 Makefile 파일을 수정해 주면 된다.
리눅스 top 디렉토리에 있는 Makefile 을 다음과 같이 수정한다. (185 line)
…
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
ARCH = arm
CROSS_COMPILE = arm-linux-
# Architecture as present in compile.h
..
ARCH 에는 빌드할 아키텍처의 종류를 명시한다. 디폴트로는 현재 빌드를 수행하는 호스트의 아키텍처가 선택된다. 즉 i386 이 되기 때문에, 크로스 빌드를 위해서는 arm이라고 명시해 줘야 한다.
CROSS_COMPILE 에는 빌드를 수행할 툴체인의 prefix를 명시한다. 여기서는 본 강좌에서 사용하는 툴체인인‘arm-linux-‘ 를 세팅하면 된다.
다음으로 커널 디렉토리 초기화를 수행한다.
# make distclean
이 과정은 커널 빌드시 커널 디렉토리 내에 생성되는 중간 파일(*.o)들과, 그밖에 임시 파일(*.tmp,*.ori, …) 들을 모두 지워, 커널을 처음 다운로드 받았을 때의 파일만을 남겨두고 모두 지우는 역할을한다. 즉, 커널 디렉토리의 초기화 상태로 만들어 주는 것이다.
다음으로, SMDK2440 용으로 빌드하기 위한 커널 옵션을 설정한다.
# make menuconfig
위와 같은 화면이 나오고, 사용할 타겟에 맞는 옵션을 지정해 주면 된다. 그런데 리눅스 커널은 많은 종류의 아키텍처 및 디바이스를 지원하기 때문에 설정해 줘야 할 사항이 많다. 각각의 플랫폼 별로 모든 옵션을 전부 선택하는 것은 쉽지 않은 일이기 때문에, 미리 디폴트로 정의된 설정 파일을 읽어 들이는 기능도 제공한다. ARM 플랫폼의 경우는 arch/arm/configs 디렉토리에 몇몇 타겟에 대한 디폴트 설정 파일이 제공되고, SMDK2440의 경우는 s3c2410_defconfig 파일을 사용하면 된다.
# cp arch/arm/configs/s3c2410_defconfig .config
# make oldconfig
해당 디폴트 설정 파일을 .config 파일로 복사하고, make menuconfig 대신에 위와 같이 oldconfig명령을 사용하면 된다.
“오픈소스로 제공되는 리눅스커널은 상당히 많은 종류의 보드와 디바이스 드라이버를
지원하기 때문에 특정 보드에서 수행되도록 하기 위해서는 약간의 수정 과정이 필요한
경우도 있다.”
SMDK2440 수정사항
오픈소스로 제공되는 리눅스 커널은 상당히 많은 종류의 보드와 디바이스 드라이버를 지원하기 때문에 특정 보드에서 수행되도록 하기 위해서는 약간의 수정 과정이 필요한 경우도 있다. 여기서는 SMDK2440 보드에서 리눅스 커널을 동작시키기 위해 필요한 수정 사항에 대해 알아본다. 먼저, 2440보드의 번호를 지정하는 코드를 추가한다. 커널이 동작하는데 있어, CPU와 보드에 따라 달라지는 부분이 있기 때문에, 커널 부팅 초반에 해당 보드의 CPU와 보드의 종류를 세팅하는 루틴이 들어가 있다. 아래와 같은 코드를 추가한다.
arch/arm/kernel/head.S (Line 84)
.section“ .text.head”,“ ax”
.type stext, %function
ENTRY(stext)
#ifdef CONFIG_CPU_S3C2440
mov r0, #0
mov r1, #(MACH_TYPE_S3C2440 & 0xff)
orr r1, r1, #(MACH_TYPE_S3C2440 & 0xff00)
#endif
msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
@ and irqs disabled
mrc p15, 0, r9, c0, c0 @ get processor id
추가된 루틴은 R1 레지스터에 2440 보드의 고유번호를 세팅하는 코드이다. 이후에 이 값을 이용하여 2440용 커널임을 인식하게 된다. 이 과정은 원래 부트로더에서 세팅을 해줘야 하는 값인데 본 강좌에서는 편의상 커널의 코드를 수정하는 방식을 채택하였다.
MACH_TYPE_S3C2440 이라는 매크로가 2440 보드의 고유번호를 나타내는데, 이 매크로가 정의된
include/asm/mach-types.h 헤더파일도 아래와 같이 추가해준다.
arch/arm/kernel/head.S (Line 24)
#include <asm/thread_info.h>
#include <asm/system.h>
#include <asm/mach-types.h>
#if (PHYS_OFFSET & 0x001fffff)
다음으로, LCD Framebuffer 와 MTD 기능을 제거한다. 이 기능들은 SMDK2440 보드에서사용하기
위해서는 소스 코드의 수정이 필요한 상태이므로 커널을 동작시켜 보는데 초점을 맞추는 본 강좌에서는 제거하기로 한다.
커널 옵션 메뉴에서 디폴트로 선택되어 있는 아래 두 개의 옵션을 끄면 된다.
Device Drivers
→ Graphics support
→ [ ] S3C2410 LCD framebuffer support
Device Drivers
→ Memory Technology Device (MTD) support
→ NAND Device Support
→ [ ] NAND Flash support for S3C2410/S3C2440 SoC
커널 빌드
다음 명령으로 커널을 빌드하여 실행 이미지를 생성한다.
# make zImage
에러 없이 제대로 빌드가 되었다면, arch/arm/boot 디렉토리에 zImage 라는 파일이 생성될 것이다. 이 파일을 타겟에서 사용하게 된다.
커널 실행하기
SMDK2440 보드에서 커널을 실행하기 위해서는, 먼저 호스트에 생성된 커널 이미지를 타겟으로 복사하는 과정을 거쳐야 한다. 먼저, 커널에서의 환경 설정을 살펴본다.
1. IP 설정
호스트와 타겟간 네트웍 통신을 하기 위해 IP를 설정한다. 호스트에는 이미 IP가 존재하고 있을 것이지만 (ifconfig 명령으로 확인할 수 있다.) 여기서는 private IP를 이용하여 타겟과의 연결을 한다. 물론, 통신만 이루어 진다면 다른 IP를 사용해도 무방하다.
- 호스트 : 192.168.95.1
- 타겟 : 192.168.95.2
로 설정을 한다. 먼저, 호스트 PC에서는 다음과 같이 설정한다.
# ifconfig eth0:1 192.168.95.1
2. tftp 설정
호스트에 있는 커널 이미지를 타겟으로 전송하기 위한 프로토콜로서 tftp를 사용한다.
호스트에 tftp 가 설치되어 있다고 가정한 상태에서 진행하기로 한다. 만일 설치가 안되어 있다면 우분투의 경우 apt-get 명령을 이용하여 설치하면 된다.
설치가 되어 있다면
관련자료
-
이전
-
다음