반응형
출처 : http://www.kandroid.org/board/board.php?board=guestbook&page=4&command=body&no=172

QEMU과 goldfish를 스터디 하면서 느낀점에 대하여 적어봤습니다.

 Android 에뮬레이터는 ARM Core의 Emulator인 QEMU을 적용하여 실제 물리적인 Board없이 ARM 임베디스 시스템 개발 등의 용도로 사용할 수 있도록 가상화하였다. QEMU를 이용한 가상의 ARM SoC인 goldfish는 Device Emulator까지 구현되어 있기 때문에 완전한 Target Board에서 테스트하는 것과 같은 효과를 얻을 수 있으며, 별도의 디버깅 장비 없이도 제어가 간편하고, 우수한 성능을 갖는 디버깅 시스템을 제공한다.


 

 Android도 임베디드 시스템을 기반으로 하고 있기 때문에 장비들을 실제로 다루어야 한다. 이러한 개발환경의 조건 때문에 디버깅이 매우 힘들며 그 디버깅 장비의 가격또한 만만치 않다.  임베디드 시스템 개발은 대부분의 시간과 비용을  비효율적인 실제 장비에서의 디버깅에 투입하게 되어 제대로된 디버깅이 되질 않는다.

  임베디드 시스템 특성 상 임베디드 시스템은 개발 시간, 고가의 Board 구매 비용, 인력, 공간 등 많은 자원을 필요로 한다. 이에'이러한 중요한 자원들을 가상화하여 개발에 투입되는 비용을 절약할 수 있는 VMware, Virtual PC, VirtualBox 등에서 찾을 수 있었다. 근래에 이러한 가상 시스템을 기반으로한 리눅스 커널 실행과 디버깅 환경에 대한 연구가 활발이 진행되고 있다. Android는 이러한 연구들을 통합한 결정판과 같은 것은 구실을 한다. 마치 '소프트웨어처럼 쉬운 디버깅환경을 android 시스템이 구현을 해 놓았다. 이를 통하여 실제 시스템(real system)에서 하는 작업과 에뮬레이션을 통한 작업이 분리가 됩으로 인하여 보다 효율적인 개발이 진행되어 질 수 있도록 하였다.

  대부분의 임베디드 초보자 및 adroid 시스템 개발 초보자들은 임베디드 시스템의 복잡한 개발환경설정과 장비들 때문에 임베디드 시스템 개발에 어려움을 많이 겪는다. 가상 환경을 사용하여 실제와 같은 임베디드 시스템을 구현함으로써 접근이 힘든 개발자 환경을 개선하여 개발자(사용자) 친화적인 임베디드 개발환경을 Andrroid의 개발환경을 이미 구축하여 놓았다.


 

  Android 임베디드 시스템의 에뮬레이터에 구현된 QEMU 기반의 goldfish는  ARM Processor를 Simulator로써 ARM Processor에 대한 이해도를 높이고, 나아가서는 ARM 보드를 가지고 있지 않아도 ARM Program을 테스트 한다든지 실제 ARM을 이용한 임베디드 시스템 개발 등의 용도로 사용할 수 있다.


 

 현재 안드로이는 QEMU을 이용하여 ARMv5 ISA를 구현하였다. 자료를 찾아보면 QEMU은 ARM에 대한 여러 버젼을 제공할 뿐만아니라 IA-32 (x86) PC, AMD64 PC, MIPS R4000, 선 SPARC sun4m, 선 SPARC sun4u, ARM 개발 보드 (Integrator/CP, Versatile/PB), SH4 SHIX 보드, 파워피씨 (PReP 및 파워 매킨토시), ETRAX CRIS 아키텍처의 에뮬레이션 기능을 지원한다.

이에 대한 의의는 대단히 크다. 즉 Android라는 소프트웨어 platform이 다양한 CPU 및 시스템에 올라갈 수 있는 근본적인 가능성을 제공하고 있다. 이에 따라서 Android에서 또하나의 집중해야할 대상은 바로 에뮬 및 가상 CPU 그리고 컴파일러등을 다양한 시스템에 맞게끔 수정 포팅해 나가는 것이다. 이런 가상환경부터 이기종 시스템에 적용할 수 있게끔 한다면 Android가 다양한 시스템에 포팅이 되는 시간도 단축이 될 수 있을 것으로 생각한다.


 

 Real target과 virtual target의 동시개발이 병행되는 것이 바람직하다고 생각하며, 이를 위해서는 QEMU 및 goldfish를 분석하는 것도 하나의 중요한 작업이라 생각한다.


 

 결론적으로 향후에 QEMU 및 goldfish등에 대한 심화된 스터디를 할 가치가 있다고 생각한다.

-------------------------------------------------------------------------------------------------------------------
출처 : http://elinux.org/Android_on_OMAP

1. Android

1. Android

 1.1 Android 란 무엇인가?

 Androids는 OS, middleware, key appliation 을 포함한 모바일 디바이스를 위한 SW 스택이다.

 1.2 versions

Google homepage에서 최신 버전을 다운로드받을 수 있다.

 2. Hardware

 2.1 Goldfish

Android SDK는 특별한(ARM) SOC을 사용하는 대신 Goldfish 라고 불리우는 가상 ARM SOC를 생성하기 위해 QEMU를 사용한다.

 가상 ARM SOC는 다음을 포함한다.

  • ARM926ej-S CPU
  • Thumb support
  • MMC
  • RTC
  • Keyboard
  • USB Gadget
  • Framebuffer
  • TTY driver
  • NAND
  • Software compiled for ARMv5TEJ instruction set (!) with EABI
  • no TLS yet

2.2 Real Hardware

Real hardware에 Android를 돌리는데 필수 사양은 다음을 만족해야 한다.

  • ARM926 또는 그 이상(ARM11 , ARM MPC, ARM Cortex)을 포함한 SOC
    • Note : ARMv4 instruction set기반인 ARM920T는 동작하지 않음
    • Target 상에서 돌아갈 Thumb & MMU & EABI 지원하는 Linux kernel
  • SOC/HW와 Linux kernel 다음을 지원해야함
    • Display/frame buffer (Frame buffer는 double buffer/page flipping을 지원해야함)
    • Keyboard
    • USB(optional)
    • RTC(optional?)
    • Serial console
    • Storage (64MB 이상) e.g. NFS / USB stick / NAND / NOR / MMC /SD card
      • etc. NFS이 개발을 위해 가장 쉬울 것이다.
    • 충분한 main memory (SDRAM, 32 MB 이상)
  • Known to work HW
    • OMAP1 based boards (ARM v5 ARM926)
    • OMAP2 based boards (ARM v6 ARM11)
    • omap2530evm
    • Sharp Zaurus SL-C760(PXA255)
    • Sharp Zaurus SL-C1000(PXA270)
    • Sharp Zaurus SL-C3000(PXA270)
    • Armadillo-500 and Armadillo Panel Computer (Freescale i.MX31L ARM11)
    • OMAP1 based OSK (OMAP5912 ARM926 with only 32MB SDRAM).
    • OMAP2430 based Hardware OMAP2EVM from Mistral Android internals ML, OMAP ML and Android on N810
    • OMAP3430 based Hardware
    • OMAP3530 based Hardware OMAP3EVM from Mistral (Android runs on ARM Cortex™-A8 Core)
    • OMAP3530 based BeagleBoard

3. Compiler

 Android를 real HW 에 동작시키지 위해서는 ARM EABI를 필요로하다.

(Tool chain, kernel, user space는 ARM EABI에 호환되어야 한다. 만일 당신이 당신 자신의 ARM EABI 호환 컴파일러, 링커, 라이브러리

를 생성하기 싫다면 CodeSourcery's ARM GNU/Linux tool chain 를 사용하라)

 

4. Code

 4.1 Kernel

Kernel 소스는 Android project page에 있다.

 4.1.1 Patch extraction

 4.1.2 Extracted patches

 4.1.3 Git patches

아직 이해하지 못해 skip 합니다....

 

4.2 File System

에뮬레이션에서 동작할 user space file system을 얻는 약간 꽁수가 필요하다.

user space binary들을 얻는 두가지 방법이 있다. : 당신이 직접 user space binary들을 추출하던지

이미 추출된 것을 가져오는 것이다.

 

4.2.1 Binary extraction

ARMv5 EABI을 위해 컴파일된 user space application은 SDK의 /tools/lib/images 디렉토리의 system.img 와 userdata.img 에

있는 android SDK의 일부분이다.

  • SDK 를 다운로드하여 압축해제
  • system.img 와 userdata.img는 yaffs2 이미지이다.
  • 아직까지 그것들의 content을 추출하기 위해 호스트상에서 직접 마운트할 방법이 없다.
  • Content을 얻기 위한 유일한 방법은 에뮬레이터를 시작하여 동작중인 에뮬레이터로 부터 내용을 추출하는 것이다. 

Unyaffs

  • 에뮬레이터에 있는 File system은 cp 또는 tar 명령어가 없는 관계로 우리는 ARM 을 위해 cross-compile된 정적으로 링크된 Busybox를 사용함. (Benno 홈페이지나 toolchain 으로 너 자신이 빌드해야한다.)
  • PATH를 에뮬레이터 툴로 설정

 export PATH=${PATH}:<path_to>/android-sdk_m5-rc14_linux-x86/tool

  • 빈 SDcard(이미지)를 생성 

 mksdcard -l card 100M card.img

  • 에뮬레이터 시작하기

 emulator -sdcard card.img -console -debug-kernel

  • SDK Kernel 부팅 및 에뮬레이터 시작
  • 에뮬레이터가 준비될 때까지 기다렸다가 ARM busybox를 host에서 시뮬레이션될 환경으로 전송

 adb -d 1 push busybox /data/busybox

  • 에뮬레이션 안에서 tar(와 bzip2) 링크를 busybox 에 설정하고 /system 과 /data 디렉토리를 sdcard 에 tar 함.
  • 에뮬레이터를 끄고 card.img를 마운트

 mount -o loop card.img mnt/

 

이로써 system 과 user data의 이미지를 얻는다.

4.2.2 Extracted binaries

 어떤 위치에 ready made binary가 존재하는 경우로써, 장점은 스스로 binary 을 추출하지 않아도 되나 단점으로는

당신이 필요한 모든 것을 포함한 이미지인지 당신의 kernel patch 버전에 맞는 이미지인지 알 수 없다는 점이다.

 

 5. Target

이번 섹션은 실제 하드웨어 타겟상에서 Android 를 동작시킬 SW(kernel, file system)를 구성하는 방법을 기술한다.

 

5.1 Kernel Configuration

먼저 kernel 이 보드상에서 정상적으로 부팅하는지 확인하라..

그리고 Android의 특정 configuration을 활성화시키고 kernel 이 여전히 부팅하는지 확인하라.

 

EABI

 CONFIG_AEABI=y
# CONFIG_OABI_COMPAT is not set

 

THUMB

 CONFIG_ARM_THUMB=y

 

 Android drivers


#
# Android
#
# CONFIG_ANDROID_GADGET is not set


# CONFIG_ANDROID_RAM_CONSOLE is not set


CONFIG_ANDROID_POWER=y

CONFIG_ANDROID_POWER_STAT=y

CONFIG_ANDROID_LOGGER=y

# CONFIG_ANDROID_TIMED_GPIO is not set

CONFIG_ANDROID_BINDER_IPC=y

#AshMem

CONFIG_ASHMEM=y

 

위의 configuration을 가진 커널이 성공적으로 부팅된 후 (m5-rc14 kernel pathch), /sys 파일들이 있는지 확인하라.

 

/sys/android_power/acquire_partial_wake_lock
/sys/android_power/acquire_full_wake_lock
/sys/android_power/last_user_activity
/sys/android_power/request_sleep
/sys/android_power/acquire_full_wake_lock
/sys/android_power/acquire_partial_wake_lock
/sys/android_power/battery_level
/sys/android_power/battery_level_low
/sys/android_power/battery_level_raw
/sys/android_power/battery_level_scale
/sys/android_power/battery_low_level
/sys/android_power/battery_shutdown_level
/sys/android_power/charging_state
/sys/android_power/release_wake_lock
/sys/android_power/request_state
/sys/android_power/state

 

5.2 File system configuration

 우리는 지금 위의 과정에서 추출된 Android file system으로 돌아간다.

Android file system은 충분한 용량( 64 MB 이상)과 target 에 접근가능한 디바이스에 만들어져야 한다.

 

options : e.g. NFS, NOR or NAND File sytem, HDD, USB storage

 

Android file systems는 네가지 부분으로 부터 빌드되어진다.

  • 위에서 추출된 system data image 컨텐츠
  • 위에서 추출된 user data image 컨텐츠
  • Android RAM disk image 컨텐츠
  • Device file system

Android file system을 생성하기 위해, 당신이 선택한 storage 을 가지고 RAM disk로 시작하자.

 

Android RAM disk image는 "tools/lib/image of Android SDK"에서 ramdisk.img로 찾을 수 있다.

 

 cp ramdisk.img ramdisk.gz
 gunzip ramdisk.gz
 cd target_fs
 cpio -iv < ../ramdisk

 

root file system tree은 다음과 같다.

 data                            /* empty directory */
 dev                             /* empty directory */
 etc
 init
 proc
 sbin
 sys
 system                        /* empty directory */
 tmp
 var

 

user data image는 /data 에 system image는 /system directory에 압축해제한다.

tar xvfj    ../system_m5_rc14.tar.bz2       system/
tar xvfj    ../userdata_m5_rc14.tar.bz2        data/

 

마지막 단계로 /dev 에 device node를 생성하는 것이다.

 

이것을 만들기 위기 위한 방법은 여러가지 옵션이 있다.

 

option 1. 동작중인 Android emulator 로 부터 device file system을 뽑아낸다.

optioin 2. 표준 file system에서 사용하고 있는 것과 같은 device file을 사용한다.

 

이중 가장 쉬운 방법을 선택하라.

Note : device node를 copy 하는 가장 좋은 방법은 source상에서 그것을 tar 하여 target에서 untar 하는 것이다.

왜냐하면 device node를 copy할 때 cp 명령어는 special device node format으로 인해 좋은 옵션이 아니다

반응형

'Android' 카테고리의 다른 글

Android 분석 팁.  (0) 2009.08.03
안드로이드 커널 올리기  (0) 2009.08.01
내가 쓴 Android 커널 빌드하기.  (1) 2009.08.01
Posted by Real_G