スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Date: --.--.-- Category: スポンサー広告   

boot.img の編集

Desire のファームウェアイメージの zip を展開すると、boot.img というファイルがあります。これは、カーネルイメージと起動時に使う一時ファイルシステム (Linux を使っている人なら initrd に相当するもの、と言えばわかりやすいかもしれません) を一つにまとめたイメージファイルです。
例えばカーネルを入れ替えたり、android 本体のシステムを読み込む前の初期設定をカスタマイズしたい場合などは、この boot.img の内容を変更する必要があります。

では boot.img の編集方法です。用意する物は、
・boot.img ファイル
・split_bootimg.pl スクリプト
・mkbootfs, mkbootimg コマンド
・Linux が稼働する PC
です。boot.img は使いたい端末用のものを用意します。また、いくつかのコマンドを実行する必要があるので、Linux 上で実行する必要があります。mkbootfs と mkbootimg は Android のソースをビルドしたときに、out/host/linux-x86/bin (記憶で書いているので間違っているかもしれません。こんな感じのディレクトリです) に作られます。android のビルドなんてしていない、と言う方は、この辺 でダウンロードできると思います。split_bootimg.pl もダウンロードしてください。

まずは適当なディレクトリを作り、その中に上記ファイルをすべて移動します。
最初に boot.img をカーネルと一時ファイルシステムに分離します。

./split_bootimg.pl boot.img


すると、同じディレクトリ内に boot.img-kernel と boot.img-ramdisg.gz という二つのファイルが作られます。

次に一時ファイルシステムを展開します。

mkdir ramdisk
cd ramdisk
zcat -dc ../boot.img-ramdisk.gz | cpio -i


「|」はパイプです。Shift キーを押しながら¥キーを押せば出せます。このコマンドではカレントディレクトリに展開してしまうので、 ramdisk という名前で展開用のディレクトリを作成し、その中に展開しています。

これで一時ファイルシステムの内容がファイルベースに展開されたので、必要に応じて編集します。init.rc あたりのファイルは、中を見るだけでもどんな処理をしているのか参考になります。

編集が終わったら、再び boot.img の形式にまとめます。まずは ramdisk ディレクトリをアーカイブします。

cd .. (ramdisk ディレクトリから出ます。既に出ている場合はこのコマンドは不要です)
./mkbootfs ./ramdisk | gzip > new-boot.img-ramdisk.gz



作成した一時ファイルシステムのファイルと、元のカーネルをアーカイブします。

./mkbootimg --cmdline 'no_console_suspend=1 msmsdcc_sdioirq=1 wire.search_count=5' \
--kernel boot.img-kernel --ramdisk new-boot.img-ramdisk.gz --base 0x20000000 -o new_boot.img


これで、new_boot.img という名前のファイルが作成されます。
この時のオプションについてです。
--cmdline は、カーネルに渡す引数です。この値は split_bootimg.pl を実行した時に、ターミナルに表示されますので、それをそのままコピーして使います。
--base は・・・何かのアドレスでしょうか? 多分、一時ファイルシステムが始まる位置のオフセットを指定しているのでは?と思っています。基本的に、同じカーネルであれば同じ値を使います。逆に言えば、異なるカーネルの場合は違う値が必要な場合があります。この値を調べるには、hexdump コマンドを以下の用に使います。

hexdump boot.img | head -n1


これを実行すると、
0000000 4e41 5244 494f 2144 e61c 0020 8000 2000
この様な出力があると思います。最初の「000000」はアドレスです。それに続く「4e41 5244 494f 2144 e61c 0020 8000」はヘッダーで固定値です。最後の「2000」(と、もしかしたらその前のバイトも?) が base オプションに指定する値の上位4桁となります。念のため、ベースにした boot.img の値を調べて置いた方がいいと思います。この値が異なると、htc ロゴで固まりますので、新しく作った new_boot.img で値が同じになる用にする必要があります。

あとはファームウェアと一緒に更新すればOKです。ただし、起動直後に関わる内容なので、何か問題があるとデバッグが大変です。起動不可になった場合も電池を抜いて強制的に終了させる必要があったりします。
mkbootimg の base オプションの値は、気がつくまで悩まされました。。。
スポンサーサイト
Date: 2010.05.26 Category: desire  Comments (2) Trackbacks (0)

この記事へのコメント:

-

Date2010.10.10 (日) 20:10:49

参考にさせていただきました。

ところで
./mkbootfs ./ramdisk > new-boot.img-ramdisk.gz
のコマンドですが、
./mkbootfs ./ramdisk | gzip > new-boot.img-ramdisk.gz
ではないでしょうか?

SC3WO06A

Date2010.10.17 (日) 01:54:14

コメントありがとうございます。

おおっと、本当ですね。間違えていました。
ご指摘ありがとうございます。修正しておきました。

管理人のみ通知 :

トラックバック:


最新記事
最新コメント
ウィジェット
月別アーカイブ
カテゴリ
プロフィール

SC3WO06A

Author:SC3WO06A
FC2ブログへようこそ!


検索フォーム
RSSリンクの表示
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
最新トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。