把玩"魔術師" -- 幫 boot.img 換 kernel

This document is provided as is. You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

請勿轉貼


從 Android 的架構圖中,以及自己的經驗,kernel 是一部 Android 手機,尤其是 如觸控螢幕、相機、GPS 等硬體設備,是否能正確運作的重要元素。有時候,我們 取得了一個 ROM,或許你只想把它的 kernel 換掉以便測試在同樣的環境下,使用 不同的 kernel 是否可以得到更好的硬體支援,那麼幫 boot.img 更換 kernel 的步驟就很重要了。

假設我們已經有了 Magic 32A 的 kernel 以及 wlan.ko,且假設我們已經取得了 給 Magic 32B 的 boot.img,因此我們需要手動產生給 32A 的 boot.img, 這是因為 32A 的 address 和 32B 的不同所導致。假設你已經依據文件將 kernel 編譯好了,也有了 boot.img;一般來說,其步驟包含:

  1. 下載 PortTools.rar。這個檔案包含了一個 Linux 的執行檔以及幾個 Perl 的執行檔,請將其 解壓所後放置於 ~/tools(或者你喜歡的任意目錄)。
  2. 將 boot.img 從 ~/froyo/out/target/product/sapphire 複製進來。
  3. 將 zImage 從 ~/froyo/kernel/arch/arm/boot 或者 CM6 EBI1/32A kernel 的壓縮檔內複製進來。
  4. 將解壓縮的檔案改變成可執行:
      chmod 755 mkbootimg-H  repack-H.pl  unpack-H.pl
      
  5. 將 kernel 以及 ramdisk 從 boot.img 萃取出來,指令如下:
      unpack-H.pl boot.img
      mkdir ramdisk
      cd ramdisk
      gunzip -c ../boot.img-ramdisk.gz | cpio -i
      cd ..
      
  6. 將適合的 kernel (給 32A 用的)複製進來,並取名為 zImage; 然後執行以下指令來產生適當的 boot.img:
      mkbootimg --kernel zImage --ramdisk boot.img-ramdisk.gz --cmdline 'no_console_suspend=1 console=null' --base 0x19200000 -o boot.img
      
  7. 除了 kernel 之外,一般的說法是 kernel 啟動的過程有可能去啟動無線網路, 如果無線網路裝置無法啟動,將會造成無法開機的現象;因此建議將 boot.img 和 wlan.ko 包在一起。包在一起的常用方式有兩種,兩者所需的工具也略有不同,我們 分別描述如下:

參考資料:How to build a kernel port for CM6 以及 [TUTORIAL] Building a EBI1/32A Port File


Last Updated: Friday, 15-Oct-2010 17:11:26 CST
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu