이지랑드로랑 - 3장. 안드로이드를 위한 준비, 커널

 

오늘은 안드로이드 프레임워크의 바닥에 깔리는 커널에 대해서 알아보도록 하겠습니다.

 

일단 먼저 말씀드리고자 하는 것은 커널을 패치하는 세세한 과정은 다루지 않겠습니다.
그렇게 되면 이 강의는 한도 끝도 없는 무한 삽질의 세계로 여러분을 안내하게 될 뿐만 아니라 최초 제가 생각했던 이지랑드로랑의 컨셉에도 어긋나기 때문이죠.
'뭐냐! 난 커널 패치하는 디테일한 것도 알고 싶다!' '강좌를 날로 먹겠다는거냐!' 이런 분들은...
유영창 이사님의 커널패치 강좌를 보시면 되요. ^^ (너무 완벽한 포럼! 자화자찬!)

 

자, 일단 우리는 커널을 좀 다운로드 받아야 할 필요성이 있습니다.
문제는 이 안드로이드란 녀석이 이전장에서 봤듯이 몇가지 특이한 사항들이 많이 있습니다.
그래서 커널도 안드로이드가 포팅되어진 상태로 존재하는 커널이 존재하고 있습니다.
2009년 11월 10일 현재, 안드로이드 공식 커널은 2.6.27과 2.6.29이 되겠습니다.
이지보드에는 2.6.29 커널이 들어가 있습니다.

 

이 커널을 어디서 어떻게 받는지 궁금하시죠!
이미 제가 포럼에 관련글을 올렸던 적이 있었습니다. (2009년 8월 25일)
아래 링크를 통해서 안드로이드용 커널 다운로드 받는 법을 참고하세요.

 

안드로이드 커널 받기 : http://forum.falinux.com/zbxe/?mid=lecture_tip&document_srl=520960

 

그러나, 여러분은 일단은 그렇게 걱정하실게 없습니다.
이미 EZ-S3C6410은 커널 2.6.29가 올라가 있기 때문이지요. 이것은 매우 해피한 일 입니다.
커널을 세세히 포팅하는 강좌는 하지 않겠지만 그래도 안드로이드를 돌리기 위해 최소한 어떤 옵션들이 활성화 되어야 하는지는 우리가 좀 알아야 하겠죠?
이게 중요합니다.
이 몇가지 필수 옵션이 없으면 안드로이드 부팅이 안되거든요.
그럼 지금부터 커널 메뉴를 좀 살펴보도록 하죠.

 

# make menuconfig

 

안드로이드를 위한 옵션만 보도록 할께요.
커널 옵션만 일일히 따지고 들어가도 너무 어마어마한 양이니까요.

 

General Setup
[ ] Create deprecated sysfs layout for older userspace tools


저 옵션이 켜져 있을 경우 안드로이드에서 SD 카드를 인식하지 못하더라구요.

Kernel Features
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)


안드로이드는 ARM EABI를 지원하는 툴체인을 사용할 수 있습니다.
커널에서도 그것을 지원할 수 있도록 해야하겠습니다.

 

ARM EABI
ARM 아키텍처의 ABI는 ARM와 (CodeSourcery를 포함하는) 그 파트너들에 의해 개발된 어떻게 컴파일러와 어셈블러와 링커와 다른 비슷한 툴들이 Object 파일과 실행 파일을 생성해야만 하는지를 설명하는 표준입니다. ARM 아키텍처의 ABI를 정확히 구현한 툴들은 상호 운용(interoperate)될 수 있습니다:예를 들면, 다른 툴체인에서 빌드된 Object 파일과 또 다른 툴체인에서 빌드된 Object파일이 양 쪽의 컴파일러가 ARM 아키텍처의 ABI를 사용한다면 함께 합쳐질 수 있습니다. "ARM EABI"는 ARM 아키텍처 ABI의 또다른 이름입니다.

 

Power management options
[*] Power Management support


파워 메니지먼트는 반드시 들어가야 하겠습니다.
이전장에서 언급했던 파워 메니지먼트를 보시면 알겠지만 안드로이드는 이 파워 부분이 민감하게 붙어있습니다.

Device Drivers
[*] Misc devices --->
[*] Android pmem allocator

Staging drivers
Android --->
[*] Android Drivers
[*] Android Binder IPC Driver
<*> Android log driver
[*] Android RAM buffer console
[*] Enable verbose console messages on Android RAM console
[*] Android RAM Console Enable error correction --->
[*] Timed output class driver
<*> Android timed gpio driver
[*] Android Low Memory Killer

 

안드로이드 관련 디바이스 옵션도 모두 활성화 시켜주셔야 합니다.
앞서 말씀드린 파워 메니지먼트를 포함해 바인더, 로우 메모리 킬러 등이 커널에서 추가되고 있다는 것을 확인할 수 있겠습니다.

다양한 커널 소스들이 있지만 오늘은 안드로이드를 부팅하게 만들어주기 위한 파티션 소스만 잠깐 보고 끝을 낼까 합니다.

 

# vi {KERNEL_SRC}/arch/arm/plat-s3c/include/plat/partition.h

 

struct mtd_partition s3c_partition_info[] = {
{ .name = "Bootloader", .offset = 0, .size = (5*SZ_1M), .mask_flags = MTD_CAP_NANDFLASH, }, { .name = "Kernel+Ramdisk", .offset = ( 5*SZ_1M), .size = (18*SZ_1M), .mask_flags = MTD_CAP_NANDFLASH, }, { .name = "system", .offset = ( 23*SZ_1M), .size = (200*SZ_1M), }, { .name = "userdata", .offset = (223*SZ_1M), .size = (200*SZ_1M), }, { .name = "cache", .offset = (423*SZ_1M), .size = (400*SZ_1M), }, { .name = "Application", .offset = (823*SZ_1M), .size = MTDPART_SIZ_FULL, } };

파티션 소스를 보시면 대충 보셔도 감이 딱 오실 것 같네요.
0번째 블록 설정부터 부트로더, 커널+램디스크 공간입니다.
2번째 블록부터는 안드로이드의 시스템 영역, 데이터 영역, 케쉬 영역 입니다.
마지막 어플리케이션 영역은 사용자가 자유롭게 사용할 수 있는 공간 입니다.
이건 다음에 안드로이드의 init.rc 파일을 분석해 보면서 또 설명드리겠지만 간단히 아래와 같습니다.

 

system 영역

안드로이드의 핵심 구성 파일들이 들어갑니다.
안드로이드 파일 시스템에서 위치상 /의 위치가 되겠습니다.

userdata 영역

사용자가 설정하는 각종 설정 파일과 프로그램들이 들어가게 됩니다.
안드로이드 피일 파일시스템에서 /data 위치가 되겠습니다.
크게 많이 사용자가 관찰하게 될 디렉토리가 몇개 있죠. 바로 data 와 app 디렉토리 입니다.
/data/data 안에는 각족 apk 팩키지들의 설정 파일과 라이브러리들이 들어가게 됩니다.
/data/app 안에는 apk 파일이 들어가게 됩니다.
여기에 사용자가 개발한 apk 파일을 복사해 넣으면 안드로이드에서 실행할 수 있습니다.

[그림3-1. /data/app 디렉토리내에 APK 파일을 넣은 모습]

 

자, 위에서 /data/app 디렉토리에서 ls를 해보니, 다양한 파일이 보이네요.
제가 만든 파일들이고요, 보니 apk 파일도 존재하네요.
안드로이드를 한번 볼까요?

 

[그림3-2. 프로그램이 등록된 모습]

 

와우! 나옵니다. 제가 등록한 프로그램 나와요.
정말 재미난 일이 아닐수가 없네요.
이렇게 조금씩 이지보드에서 안드로이드를 이용한 프로젝트를 진행할 준비가 되어가고 있습니다.

헉! 그런데 커널 보다가 왜 여기까지 온거죠? ㅡ_ㅡa


졸린가 봅니다...


휴~ 자주 글을 올리겠다고 마음 먹고 있지만 쉽지 않은 현실이네요.
너그러운 마음으로 이해해 주시기 바라고, 오늘 강좌는 여기서 마무리 하겠습니다.
다음에 또 봐요~ 제발~~~