2011年1月19日 星期三

修改android裝置的boot image

參考此網頁
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack,_Edit,_and_Re-Pack_Boot_Images

一開始要先有手機的root的權限,

取得分割表名稱
cat /proc/mtd
抓出boot.img
cat /device/mtdXX > /data/boot.img

使用上面網址提供的unpack-bootimg.pl來解開boot.img

修改完root file system 需要重包成myboot.img
mkbootfs ./boot.img-ramdisk | minigzip > my-ramdisk.cpio.gz
mkbootimg --kernel ./boot.img-kernel.gz --ramdisk my-ramdisk.cpio.gz --pagesize 2048 --cmdline 'mem=203M console=ttyMSM2 androidboot.hardware=qctmsm7x27surf' --base 0x12c00000 --output myboot.img

將device開到fastboot mode, 使用fastboot燒錄myboot.img
fastboot erase bot
fastboot flash boot myboot.img
fastboot reboot

=================================================================
若系統抓得到USB裝置,但fastboot無法抓到,可能是fastboot內沒有內建此裝置的vid, 隨便找一個android的source,到system/core/fastboot/fastboot.c加入自己的vid(可用lsusb查看vid/pid)再重編fastboot就可以了
source ../../../build/envsetup.sh;
mm;

--base的參數可由原本取出的boot.img得知
in bsp/system/core/mkbootimg/mkbootimg.c
kernel的offset為0x10008000
包成的myboot.img 最前面為一個struct boot_img_hdr
in bsp/system/core/mkbootimg/bootimg.h
boot_img_hdr 的kernel_addr在12-16 byte
使用16進位編輯器去讀取boot.img的2-16 byte(little endian)減掉kernel的offset(0x10008000)即可算出--base所需的參數

--cmdline內容也可經由16進位編輯器去讀取boot.img看到(boot_img_hdr.cmdline)

要注意的是使用unpack-bootimg.pl切出來的kernel大小可能是錯的(後面有一些多餘資料?)
實際大小須參考boot.img中的boot_img_hdr.kernel_size
然後修改mkbootimg.c, 在讀取完kernel後將boot_img_hdr.kernel_size設成正確大小
之後重編並使用此版本的mkbootimg才可正常開機

沒有留言: