posts - 33, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          android內核編譯方法

          Posted on 2011-08-31 09:25 馬航 閱讀(464) 評論(0)  編輯  收藏

            google的android很多人都希望在gphone沒有出來之前,把它移植到相關的硬件平臺上去。網上看了不少文章,總的感覺是:在這一步走得最遠的就是openmoko的一個大師級別的黑客Ben “Benno” Leslie,他曾經試圖把目前google發布的android移植到openmoko的平臺上去,并且做了10000多行代碼的嘗試。最終雖然由于 open moko采用比較老的arm 920t的內核,而android采用較新的arm926-ej-s內核,而且使用了新的內核的一些新特性,導致移植失敗,但是anyway,他已經做了足夠多的前期工作了,爾后的宣布成功移植android到real target板子上的人,大多是在他提供的patch的基礎上繼續走下去做出來的。

          下面是一些有用的參考,希望有助于對此感興趣的開發人員:
          (1)Ben “Benno” Leslie的關于andorid移植到openmoko的個人博客地址:
          http://benno.id.au/blog/

          (2)早期宣布成功移植android到zauraus-sl-c760的詳細方法描述的鏈接:
          http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760/

          (3)后續的根據上述先行者們的工作,成功移植android到zauraus-c3000的方法:
          http://androidzaurus.seesaa.net/article/74237419.html

          (4)本文是參考下面的wiki,接合個人的實踐寫出來的,對原文的作者表示一下感謝:
          http://wiki.droiddocs.net/Compilation_of_Android_kernel

            很羨慕這些人阿!

            不過很可惜,偶的開發板是s3c2410的,恰好是arm920t的核心的。。。估計移植上去戲不是很大,需要重寫很多代碼,畢竟偶跟benno相差得太遠太遠了,同樣是開發人員,差距咋就那么大呢??。ó吘筭oogle僅僅開放了kernel的源代碼而已,他們需要開放的東西還很多。)

            在這里把關于android內核編譯方法簡單寫一下,或許對希望移植內核的朋友能有些幫助:
          (看了Benno的移植過程以后,覺得即使你能夠編譯google開放出來的內核,意義也不是特別大,因為這個內核中加入了為了支持qemu的很多東西,而這些代碼似乎對希望移植到真機上的朋友來說,沒有任何意義,反而是一種阻礙)。

            1)從CodeSourcery上面載用于交叉編譯的工具鏈:http://www.codesourcery.com/gnu_toolchains/arm/download.html
          我在這里選擇的是->ARM GNU/Linux,以及IA32-GNU/Linux。有文章說應該選擇ARM EABI,我不知道了,沒有測試過,反正我選擇的這個編譯的內核也是可以跑起來的:P

            2)下載google的android linux的內核源代碼:http://code.google.com/p/android/downloads/list
          主要是這個文件:linux-2.6.23-android-m3-rc20.tar.gz

            3)把下載到的內核和交叉編譯工具解壓縮,并最好把工具鏈的路徑放到PATH里面去
          解壓縮內核:
           $ mkdir -p android
           $ cd android
           $ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz
           會解壓出來一個叫做kernel的目錄,google的android的linux內核就在里面了。

          解壓縮交叉編譯工具鏈:
           $ cd /usr/local/
           $ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 .
           $ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
          此時會解壓出來一個叫做arm2007q3的一個目錄,這里面就是工具鏈了。

          設置一下環境變量:
           $ export PATH=$PATH:/usr/local/arm2007q3/bin
          好了,到此,基本的內核編譯環境就搞好了。

            4)現在是要得到android的內核編譯參數的配置文件的時候了,該文件需要從已經安裝好的android的模擬器
          中得到才行。所以安裝android的sdk也是必須的,這一步不太明白的朋友可以參考我以前發的android
          命令行體驗的文章。
          首先啟動android模擬器,然后通過adb得到模擬器中提供的內核配置文件:
           $emulator &
           $adb pull /proc/config.gz .
          這時候adb工具會連接模擬器,并從它里面下載一個叫做config.gz的文件到你的當前目錄下。
          把它拷貝到你的kernel目錄:
           $cd ~/android/kernel
           $cp ~/config.gz .
          解壓縮該文件,并重命名為.config,這一步做了就可以跳過make menuconfig之類的內核參數設置
          動作了。
           $gunzip config.gz
           $mv config .config

            5)修改kernel目錄中的Makefile文件,用emacs或vi打開該Makefile

          修改CROSS_COMPILE變量為:
          CROSS_COMPILE=arm-none-linux-gnueabi-
          這個就是剛剛的下載和解壓的工具鏈的前綴了,旨在告訴make,在編譯的時候要使用我們的工具鏈。

          在Makefile中注釋掉LDFLAGS_BUILD_ID這個變量:
          例如將如下定義:
          LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
                            $(call ld-option, -Wl$(comma)--build-id,))
          修改為:
          LDFLAGS_BUILD_ID=
          #LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
          #                  $(call ld-option, -Wl$(comma)--build-id,))
          把它注釋掉的原因是目前android的內核還不支持這個選項。--build-id選項,主要是用于在生成的elf
          可執行文件中加入一個內置的id,這樣在core dump,或者debuginfo的時候就可以很快定位這個模塊是
          哪次build的時候弄出來的。這樣就可以避免,每次都把整個文件做一遍效驗,然后才能得到該文件的是由
          哪次build產生的。對于內核開發者來說,這是很不錯的想法,可以節約定位模塊版本和其影響的時間。
          目前,該功能還出于early stage的狀態,未來的android或許會支持,但至少目前的版本是不支持的。
          所以,用#注釋掉即可,或者害怕不保險的話,就加入LDFLAGS_BUILD_ID=空,這樣即使編譯的時候用了,
          也只是一個空格而已。
          對這個--build-id選項感興趣的朋友,可以訪問下面的網址,它的作者已經解釋得非常明白了:
          http://fedoraproject.org/wiki/Releases/FeatureBuildId

            6)終于可以開始make了。
           $ make
          不出意外的話,應該整個過程都會非常順利,最終會在~/android/kernel/arch/arm/boot目錄下面
          生成一個zImage,這個就是我們要的內核映像了。

            7)激動人心的時刻終于到來了,我們可以測試一下剛剛編譯出來的內核可以不可以用了。
           $emulator -kernel ~/android/kernel/arch/arm/boot/zImage
          當看到red eye在晃來晃去,最終顯示出來android的界面的時候,一顆懸著的心總算放下了。

          android的proc里面的version如下:
          # cat version
          Linux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008
          從這里就可以看出,這是自己編譯的kernel,而不是人家sdk里面自帶的kernel-qemu了。

          android自帶的sdk里面的kernel映像的version應該是:
          # cat version
          Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007
          hoho, 這里不會把這個開發者的email暴露出來了吧。。。

          android的cpuinfo如下:
          Processor       : ARM926EJ-S rev 5 (v5l)
          BogoMIPS        : 313.75
          Features        : swp half thumb fastmult vfp edsp java
          CPU implementer : 0x41
          CPU architecture: 5TEJ
          CPU variant     : 0x0
          CPU part        : 0x926
          CPU revision    : 5
          Cache type      : write-through
          Cache clean     : not required
          Cache lockdown  : not supported
          Cache format    : Harvard
          I size          : 4096
          I assoc         : 4
          I line length   : 32
          I sets          : 32
          D size          : 65536
          D assoc         : 4
          D line length   : 32
          D sets          : 512

          Hardware        : Goldfish
          Revision        : 0000
          Serial          : 0000000000000000
          不過挺奇怪的,google sdk自帶的內核映像的BogoMIPS是3.18的,偶編譯出來的是3.13的。


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 安塞县| 荃湾区| 莱阳市| 蕲春县| 远安县| 麻城市| 瓦房店市| 拜泉县| 那曲县| 突泉县| 黄龙县| 蓬莱市| 宾阳县| 海口市| 攀枝花市| 凤翔县| 隆子县| 临汾市| 梨树县| 延寿县| 许昌县| 怀化市| 高安市| 拜泉县| 库尔勒市| 托克托县| 都安| 芷江| 罗平县| 景德镇市| 阳原县| 普定县| 扶余县| 县级市| 新田县| 新和县| 兴隆县| 启东市| 芦山县| 大埔区| 交城县|