[출처 : Korea Android]

수많은 삽질끝에 QEMU 를 활용하여 안드로이드 포팅기술을 실습해 볼 수 있는 방법을 찾았습니다.
http://mdcamp.kr/?mid=techdata 에 접속해 보시면, 삽질의 흔적을 보실 수 있습니다.
방법을 알려드리겠습니다.
1. 업그레이드 된 QEMU 바이너리 설치하기
우분투에서 다음과 같이 최신의 QEMU 바이너리를 설치합니다.
$sudo apt-get install qemu
2. QEMU용 안드로이드 루트파일시스템 생성하기
먼저, 안드로이드 전체소스를 빌드 하십시오.
파일시스템이 저장될 디스크이미지 생성
$dd if=/dev/zero of=rootfs.ext2 bs=1024 count=128000
ext2 파일시스템으로 포멧하기
$mkfs.ext2 rootfs.ext2
loop back디바이스로 마운트 하기
$mkdir tmproot
$sudo mount -o loop rootfs.ext2 tmproot
안드로이드 파일시스템을 마운트된 디스크이미지로 복사하기
$cd tmproot
$cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/root/* .
$cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/data/ .
$cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/system/ .
안드로이드 루트파일 시스템이 rw로 mount 되도록 init.rc 수정 --->이유는 아시는분은 아실껍니다.... ^_^
$vi init.rc
다음의 부분을 찾아서
mount rootfs rootfs / ro remount
다음과 같이 수정합니다.
mount rootfs rootfs / rw remount
저장후 빠져나옵니다.
루프백 디스크이미지 언마운트 하기
$cd ..
$sudo umount tmproot
3. QEMU를 기동하여 안드로이드를 부팅하기
첨부된 커널이미지를 받아서 pwd에 저장합니다.
다음의 명령으로 안드로이드를 기동해 보십시오
$qemu-system-arm-kernel zImage.versatile -M versatilepb -hda rootfs.ext2 -usb-usbdevice wacom-tablet -no-reboot -append "root=/dev/sda rwrootfstype=ext2 init=/init "
4. 보너스, ^_^ - QEMU용 안드로이드 커널 빌드하기
$cd <여러분의 안드로이드 소스 저장된 경로>/kernel
$make menuconfig ARCH=arm
타겟 디바이스를 versatile 로 설정하고, 각종 안드로이드 feature와, SCSI하드디스크, 등 적절한 디바이스를 설정합니다.
다음의 명령으로 커널을 빌드합니다.
$make ARCH=arm CROSS_COMPILE=<여러분의 안드로이드 소스 저장된 경로>/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
좋은 자료 감사드립니다.^^
최근 안드로이드에 대해 부쩍 관심이 생겨 이래저래 가지고 놀고 있다가, 문득 리눅스 바닐라 커널에
안드로이드를 동작시켜보자라는 생각을 하게 되었습니다. 바닐라 커널에 안드로이드 Inhancement
패치를 하게되면 쉽게 해결되겠지만 순전히 학습 차원에서 binder등의 소스코드를 붙이면서 포팅해 봤습니다^^;
대상 커널 : Linux 2.6.28
대상 안드로이드 플랫폼 : Cupcake
수행 환경 : Ubuntu 8.04 x86 / qemu-system-arm (versatilepb 에뮬레이션)
먼저 가장 간단하게 포팅하기 위해 있는 Openbinder(기존 안드로이드 리눅스 소스트리의 drivers/misc/binder.c) 와
Low Memory Killer (기존 안드로이드 리눅스 소스트리의 drivers/misc/lowmemkiller.c)를 대상 커널에 복사를 하고
Kconfig에 추가시켰습니다. 타겟 보드가 따로 없는 관계로 인베인님이 윗글에 사용하신 qemu-system-arm 을 가지고
수행을 하려고 합니다. 마침 qemu-system-arm에 ARM versatilepb 디바이스를 지원하기 때문에 ,
로 커널 설정을 하고,
로 Open Binder 및 Low Memory Killer 옵션을 활성화 시켰습니다. 대부분의 Android Kernel Feature는 Optional이라고
들어서 일단 생략했습니다.
그외에 커널 EABI 컴파일 부분이나 RAM 크기를 64MB로 설정, SCSI 지원 부분등을 설정 하고
위 명령을 통해 구동을 시킨 결과, 커널 부팅 메시지는 출력되지만 /dev/sda를 찾지 못했다는 메시지를 출력 메시지와 함께
커널 패닉이 발생합니다.
몇가지 시도 끝에 versatile에서 IDE를 지원하지 못하나 생각해봤지만 인베인님이 올리신 커널에서는 제대로
동작하는 걸 봐서 이문제는 아닌것 같고..^^;; 결국 Kernel Configuation문제인것 같아서 조언을 구하고 싶습니다.
제가 사용한 config 파일을 첨부합니다.

수많은 삽질끝에 QEMU 를 활용하여 안드로이드 포팅기술을 실습해 볼 수 있는 방법을 찾았습니다.
http://mdcamp.kr/?mid=techdata 에 접속해 보시면, 삽질의 흔적을 보실 수 있습니다.
방법을 알려드리겠습니다.
1. 업그레이드 된 QEMU 바이너리 설치하기
우분투에서 다음과 같이 최신의 QEMU 바이너리를 설치합니다.
$sudo apt-get install qemu
2. QEMU용 안드로이드 루트파일시스템 생성하기
먼저, 안드로이드 전체소스를 빌드 하십시오.
파일시스템이 저장될 디스크이미지 생성
$dd if=/dev/zero of=rootfs.ext2 bs=1024 count=128000
ext2 파일시스템으로 포멧하기
$mkfs.ext2 rootfs.ext2
loop back디바이스로 마운트 하기
$mkdir tmproot
$sudo mount -o loop rootfs.ext2 tmproot
안드로이드 파일시스템을 마운트된 디스크이미지로 복사하기
$cd tmproot
$cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/root/* .
$cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/data/ .
$cp <여러분의 안드로이드 소스 저장된 경로>/out/target/product/generic/system/ .
안드로이드 루트파일 시스템이 rw로 mount 되도록 init.rc 수정 --->이유는 아시는분은 아실껍니다.... ^_^
$vi init.rc
다음의 부분을 찾아서
mount rootfs rootfs / ro remount
다음과 같이 수정합니다.
mount rootfs rootfs / rw remount
저장후 빠져나옵니다.
루프백 디스크이미지 언마운트 하기
$cd ..
$sudo umount tmproot
3. QEMU를 기동하여 안드로이드를 부팅하기
첨부된 커널이미지를 받아서 pwd에 저장합니다.
다음의 명령으로 안드로이드를 기동해 보십시오
$qemu-system-arm-kernel zImage.versatile -M versatilepb -hda rootfs.ext2 -usb-usbdevice wacom-tablet -no-reboot -append "root=/dev/sda rwrootfstype=ext2 init=/init "
4. 보너스, ^_^ - QEMU용 안드로이드 커널 빌드하기
$cd <여러분의 안드로이드 소스 저장된 경로>/kernel
$make menuconfig ARCH=arm
타겟 디바이스를 versatile 로 설정하고, 각종 안드로이드 feature와, SCSI하드디스크, 등 적절한 디바이스를 설정합니다.
다음의 명령으로 커널을 빌드합니다.
$make ARCH=arm CROSS_COMPILE=<여러분의 안드로이드 소스 저장된 경로>/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
좋은 자료 감사드립니다.^^
최근 안드로이드에 대해 부쩍 관심이 생겨 이래저래 가지고 놀고 있다가, 문득 리눅스 바닐라 커널에
안드로이드를 동작시켜보자라는 생각을 하게 되었습니다. 바닐라 커널에 안드로이드 Inhancement
패치를 하게되면 쉽게 해결되겠지만 순전히 학습 차원에서 binder등의 소스코드를 붙이면서 포팅해 봤습니다^^;
대상 커널 : Linux 2.6.28
대상 안드로이드 플랫폼 : Cupcake
수행 환경 : Ubuntu 8.04 x86 / qemu-system-arm (versatilepb 에뮬레이션)
먼저 가장 간단하게 포팅하기 위해 있는 Openbinder(기존 안드로이드 리눅스 소스트리의 drivers/misc/binder.c) 와
Low Memory Killer (기존 안드로이드 리눅스 소스트리의 drivers/misc/lowmemkiller.c)를 대상 커널에 복사를 하고
Kconfig에 추가시켰습니다. 타겟 보드가 따로 없는 관계로 인베인님이 윗글에 사용하신 qemu-system-arm 을 가지고
수행을 하려고 합니다. 마침 qemu-system-arm에 ARM versatilepb 디바이스를 지원하기 때문에 ,
$(대상 커널 소스 트리)/> make versatile_defconfig
로 커널 설정을 하고,
$(대상 커널 소스 트리)/> make menuconfig ARCH=arm
로 Open Binder 및 Low Memory Killer 옵션을 활성화 시켰습니다. 대부분의 Android Kernel Feature는 Optional이라고
들어서 일단 생략했습니다.
그외에 커널 EABI 컴파일 부분이나 RAM 크기를 64MB로 설정, SCSI 지원 부분등을 설정 하고
$(대상 커널 소스 트리)/> make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
위 명령을 통해 커널 컴파일을 수행하고 이상없이 완료되었습니다.
인베인님이 설명하신대로 루트 파일 시스템을 구성한 후,
qemu-system-arm-kernel zImage -M versatilepb -hda rootfs.ext2 -usb -no-reboot -append"root=/dev/sda rw rootfstype=ext2 init=/init"
위 명령을 통해 구동을 시킨 결과, 커널 부팅 메시지는 출력되지만 /dev/sda를 찾지 못했다는 메시지를 출력 메시지와 함께
커널 패닉이 발생합니다.
몇가지 시도 끝에 versatile에서 IDE를 지원하지 못하나 생각해봤지만 인베인님이 올리신 커널에서는 제대로
동작하는 걸 봐서 이문제는 아닌것 같고..^^;; 결국 Kernel Configuation문제인것 같아서 조언을 구하고 싶습니다.
제가 사용한 config 파일을 첨부합니다.
'Android > Android&Kernel' 카테고리의 다른 글
| 구글 안드로이드 - JNI : native binding to java (0) | 2009/04/15 |
|---|---|
| Android System Library 개요 (0) | 2009/04/15 |
| REAL TARGET BOARD 없이 안드로이드 포팅기술 익히기 (0) | 2009/04/14 |
| Dalvik JNI 를 이용한 cpp 함수 추가 및 SDK 에서 사용하기 (0) | 2009/04/14 |
| 안드로이드 전체소스 빌드(For X86) - Ubuntu사용자 (0) | 2009/04/14 |
| 안드로이드 Native Development Kit(NDK) 사용법 (0) | 2009/04/14 |
TAG Android
zImage.versatile