Feeds:
文章
留言

Archive for 2008 年 5 月 13 日

原作:劉旭暉 轉載請註明出處 http://blog.csdn.net/colorant/
增訂:Rider

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

1.1 運行平台

Google 的Android平台到20020227為止,應用部分還是以二進制的 Binary形式發佈的,其编譯的目標平台 ARM926EJ-S的CPU是屬於ARMV5T的版本,所以ARMV4架購的CPU平台無法使用其二進制代碼。關於這點,可以参考下面這篇文章,Benno在此做了詳細的理論分析和代碼測試:http://benno.id.au/blog/2007/11/21/android-neo1973 .  不過依照目前現階段情形除了原本基於ArmV5或以上的架構的平台可以實際運行Android外,亦可在 ARMV4 上面運行了,詳細操作步驟請參考文章最下面 Benno’s 的一些連結資訊,他有 release 一些 patch 可以供 porting 實驗之用。

1.2 軟體環境(開發所需資源)

Android Official Download:

Kernel, emulator, development tool 等下載點: http://code.google.com/p/android/downloads/list
Android SDK 載點:http://developer.android.com/sdk/1.5_r1/index.html

1.2.1 Kernel

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

有興趣的開發者可以到 http://android.git.kernel.org/ 去 git 最新的 android code 來 patch 或修改成自己平台能跑的 kernel. 像我就是先 git 下來後再 follow benno release 的 patch 來編出一個我那塊 ARM920T 板子可以跑的 kernel

1.2.2 Toolchain

SDK中的內核使用的是4.2.1版本的GCC基本上,你需要的是一個支持EABI的工具鏈,比如你可以使用 Codesourcery 所提供的最新工具鏈,我是直接從 http://www.codesourcery.com/sgpp/lite/arm/portal/release642 下載 IA32 GNU/Linux 的 toolchain for ARM EABI, 也可以下載 Benno’s  所使用的 官方 toolchain  ( 載點: http://android.git.kernel.org/pub/android-toolchain-20081019.tar.bz2 )

1.2.3 其他工具

Android的Emulator是一個很好的仿真工具,其底層是基於QEMU來實現的,可以使用SDK中的adb工具來登入 Emulator的控制台,並和控制台交換檔案系統等,藉以獲取你所需的檔案。你也可以將已經編好的 kernel 讓 emulator 來掛載跑看看

1.3 相關論壇資源

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

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

2. Porting 基本思路

2.1 所需資源

2.1.1 硬體

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

2.1.2 軟體

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

2.2 基本流程

下載Android kernel

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

配置內核,確保下列內容得到配置 (for armv4t):

CONFIG_AEABI=y
CONFIG_ARM_THUMB=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_LOGGER=y
CONFIG_SHMEM=y
CONFIG_ASHMEM=y
CONFIG_ANDROID_PARANOID_NETWORK=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去跟踪問題!
  • 使用strace去跟踪問題!

4. Android resources & reference

5. Android porting on ARM920T Platform

    流程 (by Rider):
    Step1: 先到 http://android.git.kernel.org/ 去 git 一份 android project source 下來.
    Step2: 選擇你想使用的 toolchain, 下面有 android-toolchain 的連結可以抓 (建議還是先用 android-toolchain – 成功率比較高), 當然也可以使用 Codesourcery 所提供的 (問題會比較多). 當然如果這兩各 toolchain 都安裝失敗的話, 且又恰巧你是使用 deb system的, 那你就可以去 koolu 下載他們已經打包好的 toolchain (下面連結有). 如果是直接用套件安裝的話, 預設安裝目錄會在 /opt/android-toolchain/
    Step3: 下載 benno’s patch 然後逐一 patch 吧! 由於時間點的不同,所以 android project source 版本也不儘相同. 所以在 patch 時勢必會遇到許多麻煩,因此最好閱讀了解一下 patch 所改的部份及觀念再逐一 patch 過去.
    Step4: 我另外也用了 change set 1663, 這樣在編譯時才不會發生 macros  (asm code) 不 supprot V4 指令集的問題.
    Step5: 可以寫一支 script 來方便編譯進行. 我則是用一支 androidv4.sh (如下) (記得先裝: mtd-tools )

    #!/bin/sh

    make TARGET_ARCH_VERSION=armv4 \
    MKJFFS2_CMD="ssh nirvana -x \"cd `pwd`; mkfs.jffs2\"" \
    SYSTEM_FSTYPE=jffs2 \
    USERDATA_FSTYPE=yaffs \
    TARGET_TOOLS_PREFIX=/home/rider/android-toolchain/bin/armv4t-android-eabi- $@

    Step6: 接著 run 這支 script 開始編譯吧 ~ Good Luck ! XD
    Step7: 編譯完成後, 便會產生 rootfs: ramdisk.img, userdata.img & system.img
    • ramdisk.img: The ramdisk image used to boot the system.
    • userdata.img: The initial user-data disk image.
    • system.img: The initial Android system image.
    Step8: 接著就是編 kernel了, Openmoko users 可以按照著 benno 的建議使用 OpenMoko-2.6.24 stable 來 patch 成 for android kernel. 我則是直接去 kernel.org 下載 vanilla 2.6.24 kernel 來 patch kernel. kernel patch" & config 下面的連結有請服用.
      HowTo Make:
      1. rider@embedded:~/android/linux-2.6.24$ patch -p1 < ../android-openmoko-kernel.diff
      2. rider@embedded:~/android/linux-2.6.24$ make -j 2 zImage ARCH=arm CROSS_COMPILE=armv4t-android-eabi-
      3. Then arch/arm/boot/zImage is ready.
      Step9: 編譯完成後可以使用 SDK 所提供的模擬器來掛載編好的 kernel & rootfs 測試看看, 記得指向正確的 image 存放位置.
      • Run: emulator -kernel ./zImage -system ./system.img -ramdisk ./ramdisk.img -initdata ./userdata.img
      • or Run: emulator -kernel ./zImage -system ./img (將3個 img file 皆存放在 img/ 的目錄下)

      Reference:

      Modified by Rider

      Read Full Post »

      隨著微軟與雅虎就所提議的收購陷入僵局,其競爭對手IBM以及谷歌逐漸加大努力,以攜手主宰它們認為將在21世紀主導軟件分銷的模式,即所謂的雲計算(cloud computing)。

      迄今為止,它們的大多數工作在低調的幕後進行,但是,在上周四在IBM在洛杉磯舉行的大會上,這兩家公司的首席執行官做出少見的共同會面時,它們之間的密切關系旋即完全曝光。

      IBM的SamPalmisano以及谷歌的EricSchmidt從領導力以及創新上依次贊揚了對方。他們還堅持認為,兩家公司具有許多相似性,盡管谷歌這家立足硅谷的消費網絡巨頭與位於紐約郊外的IBM這家從事商業計算的百年老店之間存在顯著差異。

      Palmisano笑談道:『我們令人厭煩,他們令人激動;我們步履蹣跚,他們舉止敏捷;我們機構臃腫,他們人員精乾。』然而,他表示,IBM和谷歌之間的對比是非常膚淺的,他指出,兩家供應商均『根植於創造價值』並且分享『共同的技術合作。』

      Schmidt透露說,IBM還處理谷歌的賬戶支付工作。

      IBM和谷歌計劃開拓它們對全球的共同技術觀察以及大量的人纔,以構架一個全球性網絡,或者說,服務器雲,消費者和企業將從中下載一切內容,從在線足球賽程到先進的工程應用資料。

      『這是我們終身追求的目標,』Schmidt表示。

      這個聯盟懷著宏偉的雄心,當幾年前Palmisano在電話中與Schmidt做了簡單的交流之後就開始了。

      『我們並不是尋求賣什麼產品給他們,』Palmisano解釋說。

      這次通話導致了白板會議設備的誕生,並最終在協作努力之下,IBM和谷歌構建了它們自己的雲計算,並在那年十月提交給幾所頂級工程大學,包括MIT、斯坦福以及卡內基梅隆,從而開闢了一個市場。

      IBM-谷歌之雲對於微軟來說,可能更像日益逼近的暴風雨,它運行在Linux之上,IBM早已擁抱它作為一種Windows的替代品。它還包含Xen系統虛擬化以及ApacheHadoop,它們是谷歌文件系統的開放源實現。

      谷歌已經向消費者推出了若乾免費的、基於雲的服務,如電子郵件和存儲,但是,它剛剛叩開有利的商業市場。除了安全要求以外,『在企業雲與消費者雲之間沒有太大差異,』Schmidt在這一點上指出。

      『雲在商業上具有較高的價值,那是我們與IBM協作的秘密,』他補充說道。

      谷歌與IBM一道令人信服地向商業和消費市場中的計算機用戶提供主機產品,范圍包括基本的生產率軟件,如文字處理以及日歷(如谷歌的Docs和 IBM的LotusSymphony套件),乃至尖端的安全性以及管理工具(通過IBM的Tivoli產品以及谷歌的Postini部門)。

      當微軟努力開發一種它自己的連貫網絡策略之時,IBM和谷歌之間的合作伙伴關系被強化了,微軟是IBM以及谷歌的共同競爭對手。

      對於雲計算發展趨勢的回答就是,把一些應用轉移至互聯網之下,采取所謂的軟件加服務的策略。然而,微軟這個巨頭的盈利仍然來自軟件,這些軟件要麼在零售店以軟件盒方式出售,要麼在像戴爾這樣的巨型制造商的個人電腦中預裝。

      微軟意欲收購雅虎就是為了提昇其網絡存在,但是,首席執行官SteveBallmer的侵略性戰術(他最近給予雅虎三個星期的通牒要求接受收購;但是,上周末平安無事地過去了)只會造成其目標收購對象的敵意。雖然收購無法成為現實,但兩家公司之間的合作關系似乎不成問題,只要現有的管理層在兩家公司均在位。

      與此同時,IBM和谷歌似乎准備從其學術研究成果推出雲計算的產品版本。

      兩家公司在上周四並未就實現那個目的而做出詳細的發布,但是,Schmidt和Palmisano均充滿友好輕松色彩的講話,給人留下了攜手努力無疑將加速的印象。的確,他們可能已經充分地在洛杉磯大會中心向幾千家由IBM業務合作伙伴構成的聽眾做了說明,那就是『關注這一領域。』

      備注:關於『雲計算』

      雲計算(CloudComputing)是分布式處理(DistributedComputing)、並行處理(ParallelComputing)和網格計算(GridComputing)的發展,或者說是這些計算機科學概念的商業實現。

      雲計算的基本原理是,通過使計算分布在大量的分布式計算機上,而非本地計算機或遠程服務器中,企業數據中心的運行將更與互聯網相似。這使得企業能夠將資源切換到需要的應用上,根據需求訪問計算機和存儲系統。

      這可是一種革命性的舉措,打個比方,這就好比是從古老的單臺發電機模式轉向了電廠集中供電的模式。它意味著計算能力也可以作為一種商品進行流通,就像煤氣、水電一樣,取用方便,費用低廉。最大的不同在於,它是通過互聯網進行傳輸的。

      雲計算的藍圖已經呼之欲出:在未來,只需要一臺筆記本或者一個手機,就可以通過網絡服務來實現我們需要的一切,甚至包括超級計算這樣的任務。從這個角度而言,最終用戶纔是雲計算的真正擁有者。

      雲計算的應用包含這樣的一種思想,把力量聯合起來,給其中的每一個成員使用。

      目前,PC依然是我們日常工作生活中的核心工具——我們用PC處理文檔、存儲資料,通過電子郵件或U盤與他人分享信息。如果PC硬盤壞了,我們會因為資料丟失而束手無策。

      而在『雲計算』時代,『雲』會替我們做存儲和計算的工作。『雲』就是計算機群,每一群包括了幾十萬臺、甚至上百萬臺計算機。『雲』的好處還在於,其中的計算機可以隨時更新,保證『雲』長生不老。Google就有好幾個這樣的『雲』,其他IT巨頭,如微軟、雅虎、亞馬遜(Amazon)也有或正在建設這樣的『雲』。

      屆時,我們只需要一臺能上網的電腦,不需關心存儲或計算發生在哪朵『雲』上,但一旦有需要,我們可以在任何地點用任何設備,如電腦、手機等,快速地計算和找到這些資料。我們再也不用擔心資料丟失。

      雲計算的說法正在廣為流行,Gartner高級分析師BenPring評價道:『它正在成為一個大眾化的詞語。』但是,問題是似乎每個人對於雲計算的理解各不相同。作為一個對互聯網的比喻,『雲』是很容易理解的。但是一旦同『計算』聯系起來,它的意義就擴展了,而且開始變得模糊起來。有些分析師和公司把雲計算僅僅定義為計算的昇級版——基本上就是互聯網上提供的眾多虛擬服務器。另外一些人把雲計算定義的更加寬泛,他們認為用戶在防火牆保護之外消費的任何事物都處於『雲』之中。

      Source: http://www.enorth.com.cn

      Read Full Post »