亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
Simple guid for porting android kernel
[打印本頁(yè)]
作者:
goandroid
時(shí)間:
2009-11-09 15:34
標(biāo)題:
Simple guid for porting android kernel
作者:劉旭暉 colorant@163.com 轉(zhuǎn)載請(qǐng)注明出處
http://blog.csdn.net/colorant/
移植Android的kernel到實(shí)際的硬件平臺(tái)上,很多人很早就做過(guò)這件事了,不過(guò)相關(guān)的文檔和經(jīng)驗(yàn)總結(jié)不多,我就寫(xiě)一個(gè)吧,也為了自己記錄一下大致的流程,以后好繼續(xù)。
1 Android內(nèi)核Porting相關(guān)背景知識(shí)
1.1 運(yùn)行平臺(tái)
Google的Android平臺(tái)到今天為止(2008-2-27),應(yīng)用層部分還是以二進(jìn)制的Binary的形式發(fā)布的,其編譯的目標(biāo)平臺(tái)是ARM926EJ-S的CPU屬于ARMV5T的版本,所以ARMV4架構(gòu)的CPU平臺(tái)無(wú)法使用其二進(jìn)制代碼。關(guān)于這點(diǎn),可以參考下面這篇文章,Benno在此做了詳盡的理論分析和代碼測(cè)試:http://benno.id.au/blog/2007/11/21/android-neo1973
所以目前只有基于ArmV5或以上的架構(gòu)的平臺(tái)可以實(shí)際運(yùn)行Android。
1.2 軟件環(huán)境
SDK下載:http://code.google.com/android/download_list.html
KERNEL,模擬環(huán)境等SRC包下載:http://code.google.com/p/android/downloads/list
1.2.1 Kernel
到M5-r14 release 為止,Android的Kernel是基于Linux2.6.23的內(nèi)核開(kāi)發(fā)的,主要添加了一個(gè)名為Goldfish的虛擬CPU以及Android所需相關(guān)特定驅(qū)動(dòng)代碼。
你需要一個(gè)支持EABI的內(nèi)核作為你內(nèi)核Porting的起點(diǎn)(最低版本?不知道,只要EABI OK,應(yīng)該沒(méi)有本質(zhì)區(qū)別,但是,Android的很多驅(qū)動(dòng)依賴于2.6.23的內(nèi)核API,版本越低的內(nèi)核,移植修改內(nèi)核相關(guān)代碼的工作量越大)
1.2.2 Tools chain
SDK中的內(nèi)核使用的是4.2.1版本的GCC,基本上,你需要的是一個(gè)支持EABI的工具鏈,比如你可以使用Codesourcery的最新工具鏈:http://www.codesourcery.com/
1.2.3 其它工具
Android的Emulator是一個(gè)很好的仿真工具,其底層是基于QEMU來(lái)實(shí)現(xiàn)的,可以使用SDK中的adb工具登陸Emulator的控制臺(tái),和控制臺(tái)交換文件等,用于獲取你所需的信息。
1.3 相關(guān)論壇資源等
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 硬件
首先,當(dāng)然是需要一個(gè)可以用來(lái)向上porting的硬件開(kāi)發(fā)板了,對(duì)硬件的需求除了上面說(shuō)的,需要ArmV5+兼容的CPU以外,最低要求基本需要64M+的內(nèi)存,64M-128M+的FLASH(取決于你加載文件系統(tǒng)的方式,如果可以透過(guò)網(wǎng)絡(luò)使用NFS-ROOT或者M(jìn)MC卡等來(lái)存放文件系統(tǒng)的話,這個(gè)應(yīng)該就無(wú)所謂了)
2.1.2 軟件
除了上述kernel和tools chain,為了方便調(diào)試,最好有靜態(tài)編譯的Busybox和Strace等工具。也可以從Benno的blog上下載到他編譯好的版本。
2.2 基本流程
下載Android內(nèi)核代碼
下載官方2.6.23內(nèi)核
制作Android和2.6.23內(nèi)核的diff文件
去除diff文件中和Goldfish和QEMU相關(guān)的代碼,如果你的系統(tǒng)已經(jīng)支持YAFFS2,還可以去除這部分代碼
將diff文件Patch到你自己的內(nèi)核上,如果需要,修改內(nèi)核相關(guān)文件代碼使得patch能夠順利完成。(這部分大概是主要的工作量,如果你的內(nèi)核版本差得比較遠(yuǎn)的話 8 )
如果必要,修改你的內(nèi)核代碼中Framebuffer的驅(qū)動(dòng),使其Virtual_yres 等于兩倍的Yres,并實(shí)際分配兩倍分辨率大小的framebuffer內(nèi)存。
配置內(nèi)核,確保下列內(nèi)容得到配置:
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的文件系統(tǒng),基本上你只需要System etc sbin init這幾個(gè)目錄/文件就可以了,其它自建,其中data目錄是有內(nèi)容的,但是這個(gè)目錄的內(nèi)容可以由Android在啟動(dòng)時(shí)動(dòng)態(tài)的創(chuàng)建出來(lái)。(可以使用adb工具在EMULATOR先tar包裝,再拷貝出來(lái)。M3的release也可以從benno那里直接拿到他抓出來(lái)的文件系統(tǒng))
確保你的dev目錄下有足夠系統(tǒng)啟動(dòng)的設(shè)備節(jié)點(diǎn),如console等,其它的節(jié)點(diǎn)Android在啟動(dòng)過(guò)程中會(huì)自動(dòng)創(chuàng)建出來(lái)。
使用NFSROOT或者chroot等手段啟動(dòng)Android的文件系統(tǒng)。
啟動(dòng)流程的大致外在表現(xiàn)分階段依次是:
Ø LCD上出現(xiàn)Android幾個(gè)字符
Ø LCD短時(shí)間的Blank
Ø LCD上出現(xiàn)一個(gè)左右滾動(dòng)的紅色滾動(dòng)條 (如果有問(wèn)題,基本上就死在這一步了 8 )
Ø 進(jìn)入主界面
目前為止我的狀態(tài)是:鍵盤(pán)可以工作,觸摸屏有響應(yīng)但是未校準(zhǔn),位置不對(duì),啟動(dòng)最后階段以及之后啟動(dòng)新的程序,出現(xiàn)Vmalloc分配內(nèi)存Failed問(wèn)題,導(dǎo)致如Brower等應(yīng)用程序不能完全啟動(dòng)。其它網(wǎng)絡(luò)等東東還沒(méi)開(kāi)始看呢 8 )
3 一些TIPS
Ø Android會(huì)對(duì)文件使用memory mapped的方式進(jìn)行操作,JFFS2不支持這種操作,所以要使用別的文件系統(tǒng)。當(dāng)然也有繞過(guò)去的辦法,自己搜一下吧 8 )
即http://nemustech.blogspot.com/說(shuō)的方法:
* if you have jffs2 for / patch /init
* modify with hexedit : "/system_property" -> "/tmp/sy_property"
* NOTE: jffs2 does not support memory mapped file
Ø 為了方便測(cè)試,可以修改/etc/init.rc,注釋掉 runtime,dbus-daemon,Xzygote等相關(guān)內(nèi)容,在init啟動(dòng)以后再手工啟動(dòng)這些進(jìn)程:
/system/bin/app_process -Xzygote /system/bin --zygote &
/system/bin/dbus-daemon --system --nofork &
sleep 1;
/system/bin/runtime &
Ø Android的Init位于根目錄下,所以如果你需要直接啟動(dòng)Init,可以在內(nèi)核參數(shù)命令行中用init=/init 來(lái)指定,或者chroot 目錄 /init來(lái)指定。 當(dāng)然,啟動(dòng)/bin/sh以后,再手動(dòng)啟動(dòng)/init也是可以的。
Ø /dev/binder /dev/alarm /dev/log/* 等文件是最重要的幾個(gè)設(shè)備節(jié)點(diǎn),由于這幾個(gè)設(shè)備節(jié)點(diǎn)號(hào)的主次設(shè)備號(hào)是動(dòng)態(tài)分配的,所以,最好確認(rèn)你的文件系統(tǒng)中的這幾個(gè)設(shè)備節(jié)點(diǎn)的主次設(shè)備號(hào)是否正確。如果不知道如何確認(rèn),直接刪除掉再重啟 8 )
Ø 如果flash速度太慢或者nfs網(wǎng)絡(luò)連接太差,可以將data tmp這兩個(gè)目錄mount到內(nèi)存里,前提是你的內(nèi)存足夠大 8 )
Ø 如果啟動(dòng)過(guò)程中,紅色滾動(dòng)條速度太快(和emulator里的表現(xiàn)比較),runtime或者system_server進(jìn)程CPU占用率接近100%,那么你可以修改一下你的framebuffer代碼中pan_display相關(guān)的函數(shù)的代碼,保證其調(diào)用返回時(shí)得到足夠的幀同步延遲時(shí)間。據(jù)Google的swetland給我的說(shuō)法是: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的內(nèi)核代碼有M3-r20和M5-r14兩個(gè)版本,這兩個(gè)版本對(duì)binder和power兩個(gè)驅(qū)動(dòng)做了較大的修改,上層的文件系統(tǒng)和內(nèi)核必須配套使用。( 另,我的板子上,M5版本可以跑起來(lái),M3的版本會(huì)出現(xiàn)段錯(cuò)誤,沒(méi)跑起來(lái) :(。如果一個(gè)版本實(shí)在跑不起來(lái),不妨試試別的版本)
Ø 使用strace去跟蹤問(wèn)題!
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):
http://blog.chinaunix.net/u2/85805/showart_2089932.html
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2