2008年11月7日 星期五

Simple Guide for Porting Android Kernel[轉貼]

作者:劉旭暉colorant@163.com轉載請註明出處
http://blog.csdn.net/colorant/

移植Android的kernel到實際的硬件平台上,很多人很早就做過這件事了,不過相關的文檔和經驗總結不多,我就寫一個吧,也為了自己記錄一下大致的流程,以後好繼續。

1. Android內核Porting相關背景知識

1.1 運行平台
Google的Android平台到今天為止(2008-2-27),應用部分還是以二進制的Binary的形式發布的,其编譯的目標平台是ARM926EJ-S的CPU屬於ARMV5T的版本,所以ARMV4架購的CPU平台無法使用其二進制代碼。關於這點,可以参考下面這篇文章,Benno在此做了詳細的理論分析和代碼測試:http://benno.id.au/blog/2007/11/21/android-neo1973 . 所以目前只有基於ArmV5或以上的架構的平台可以實際運行Android。

1.2 軟件環境

SDK下載:

KERNEL,模擬環境等SRC包下載: http://code.google.com/p/android/downloads/list

1.2.1 Kernel

到M5-r14 release為止,Android的Kernel是基於Linux2.6.23的內核開發的,主要添加了一個名為Goldfish的虛擬CPU以及Android所需相關特定驅動代碼。你需要一個支持EABI的內核作為你內核Porting的起點(最低版本?不知道,只要EABI OK,應該沒有本質區別,但是,Android的很多驅動依賴於2.6.23的內核API,版本越低的內核,移植修改內核相關代碼的工作量越大)

1.2.2 Toolchain

SDK中的內核使用的是4.2.1版本的GCC,基本上,你需要的是一個支持EABI的工具鏈,比如你可以使用Codesourcery的最新工具鏈: http://www.codesourcery.com/

1.2.3 其他工具

Android的Emulator是一個很好的仿真工具,其底層是基於QEMU來實現的,可以使用SDK中的adb工具登陸Emulator的控制台,和控制台交換文件等,用於獲取你所需的信息。

1.3 相關論壇資源

http://benno.id.au/blog/

http://groups.google.com/group/android-internals

http://groups.google.com/group/android-developers

2. Porting 基本思路

2.1 所需資源

2.1.1 硬件

首先,當然是需要一個可以用來向上porting的硬件開發板了,對硬件的需求除了上面說的,需要ArmV5+兼容的CPU以外,最低要求基本需要64M+的內存,64M-128M+的FLASH(取決於你加載文件系統的方式,如果可以透過網絡使用NFS-ROOT或者MMC卡等來存放文件系統的話,這個應該就無所謂了)

2.1.2 軟件

除了上述kernel和tools chain,為了方便調試,最好有靜態編譯的Busybox和Strace等工具。 也可以從Benno的blog上下載到他編譯好的版本。也可以從Benno的blog上下載到他編譯好的版本。

2.2 基本流程

下載Android內核代碼

(1).下載官方2.6.23内核
(2).製作Android和2.6.23内核的diff文件
(3).去除diff文件中和Goldfish和QEMU相關的代碼,如果你的系統已經支持YAFFS2,還可以去除這部分代碼去除diff文件中和Goldfish和QEMU相關的代碼,然後將diff文件Patch到你自己的内核上,如果需要,修改内核相關文件代碼使得patch能夠順利完成。將diff文件Patch到你自己的內核上,如果需要,修改內核相關文件代碼使得patch能夠順利完成。 (這部分大概是主要的工作量,如果你的内核版本差得比較遠的話)
(4).如果必要,修改你的内核代碼中Framebuffer的驅動,使其Virtual_yres 等於兩倍的Yres,並實際分配兩倍分辨率大小的framebuffer内存。

配置內核,確保下列內容得到配置:
CONFIG_ARM_THUMB=y
CONFIG_AEABI=y
CONFIG_BINDER=y
CONFIG_ANDROID_LOG=y
CONFIG_ANDROID_POWER=y
CONFIG_ANDROID_POWER_STAT=y

*從SDK中獲取Android的文件系統,基本上你只需要System etc sbin init這幾個目錄/文件就可以了,其它自建,其中data目錄是有內容的,但是這個目錄的內容可以由Android在啟動時動態的創建出來。
*可以使用adb工具在EMULATOR先tar包裝,再拷貝出來。M3的release也可以從benno那裡直接拿到他抓出來的文件系統
*確保你的dev目錄下有足夠系統啟動的設備節點,如console等,其它的節點Android在啟動過程中會自動創建出來。
*使用NFSROOT或者chroot等手段Android的文件系统。

啟動流程的大致外在表現分階段依次是:

Ø LCD上出現Android幾個字符
Ø LCD短時間的Blank
Ø LCD上出現一個左右滾動的紅色滾動條 (如果有問題,基本上就死在這一步了)
Ø 進入主界面
目前為止我的狀態是:鍵盤可以工作,觸摸屏有響應但是未校準,位置不對,啟動最後階段以及之後啟動新的程序,出現Vmalloc分配內存Failed問題,導致如Brower等應用程序不能完全啟動。 其它網絡等東東還沒開始看呢。

3. 一些TIPS

*Android會對文件使用memory mapped的方式進行操作,JFFS2不支持這種操作,所以要使用別的文件系統。 當然也有繞過去的辦法,自己搜一下吧。
*為了方便測試,可以修改/etc/init.rc,註釋掉runtime,dbus-daemon,Xzygote等相關內容,在init啟動以後再手工啟動這些進程:

/system/bin/app_process -Xzygote /system/bin –zygote &
/system/bin/dbus-daemon –system –nofork & /system/bin/dbus-daemon –system –nofork &
sleep 1; sleep 1;
/system/bin/runtime & /system/bin/runtime &

*Android的Init位於根目錄下,所以如果你需要直接啟動Init,可以在內核參數命令行中用init=/init來指定,或者chroot目錄/init來指定。 當然,啟動/bin/sh以後,再手動啟動/init也是可以的。
*/dev/binder /dev/alarm /dev/log/*等文件是最重要的幾個設備節點,由於這幾個設備節點號的主次設備號是動態分配的,所以,最好確認你的文件系統中的這幾個設備節點的主次設備號是否正確。 如果不知道如何確認,直接删除掉再重啟動。
*如果flash速度太慢或者nfs網絡連接太差,可以將data tmp這兩個目錄mount到內存裡,前提是你的內存足夠大。
*如果啟動過程中,紅色滾動條速度太快(和emulator裡的表現比較),runtime或者system_server進程CPU佔用率接近100%,那麼你可以修改一下你的framebuffer代碼中pan_display相關的函數的代碼,保證其調用返回時得到足夠的幀同步延遲時間。 據Google的swetland給我的說法是:This is usually indicative of lack of vsync/pageflip in the fb driver.The surfaceflinger believes it will be limited by the vsync rate and the startup animation depends on that.
*目前的Android的內核代碼有M3-r20和M5-r14兩個版本,這兩個版本對binder和power兩個驅動做了較大的修改,上層的文件系統和內核必須配套使用。 (另,我的板子上,M5版本可以跑起来,M3的版本會出現段錯誤,沒跑起來:(如果一個版本實在跑不起來,不妨試試別的版本)
*使用strace去跟踪問題!

There are some reference sites for research listed below:
http://wiki.droiddocs.net/Compilation_of_Android_kernel
http://benno.id.au/blog/
http://code.google.com/p/androidbmi/
http://www.anddev.org/
android內核編譯方法: http://blog.chinaunix.net/u/26691/showart_468007.html

http://code.google.com/p/android/downloads/list 下載emulator以及kernel. 下載而來的SDK可以檢視其rootfs,再對照 http://blog.chinaunix.net/u/26691/showart_468007.html or http://wiki.droiddocs.net/Compilation_of_Android_kernel 來編譯出自己的 kernel 給 emulator來掛載. kernel config file在 陈罡的blog亦可下載取得. 在上一篇 adnroid news 裡面有一些研究出來的心得與 URL 可以供參考學習.

想知道Android模擬器裏的Kernel config設定檔嗎?
命令:adb pull /proc/config.gz .
上面那行指令可以把Kernel config取出來看唷!

轉載來源:
http://rider51.wordpress.com/2008/05/13/simple-guide-for-porting-android-kernel/

沒有留言: