Monday, January 12, 2009

Android Dream phone の kernel module のbuild

ext2.koなんかをつくったりするためのやりかたのメモ。
基本的にはBuilding for Dreamで環境を整える。
kernelだけならkernel/msmrefs/heads/android-msm-htc-2.6.25というrevisionをとってくればよいだけだとおもう。kernel versionがかわっていたら違うrevisionをとってくること。まあkernelのgitだけより全部のmoduleをrepoでとってきたほうがprebuiltにtoolchainなんかもはいっているのでそのほうが楽かも。
実機のkernelがどのversionかはuname -rなどで確認。unamebusyboxにはいってる。
CONFIG_LOCALVERSION_AUTOがセットされおりgit revisionの情報がkernel moduleのversionに追加されているため、git revisionをあわせる必要がある。kernel/scripts/setlocalversionをみればわかるようにgit describeの結果あたりが使われているのでそれがあうようなrevisionにする。git logでcommit logがわかるので、commitの行のhash値をつかってcheckoutしつつgit describeがそれっぽいのになるのにあわせる。
% git checkout commit行のhash値
% git describe
あとは/proc/config.gzをとってきて、必要なconfigをしなおしてmake。gccのバージョンは実機の/proc/versionなどでチェック。CROSS_COMPILEgccなどへのprefixをセットする。
% adb pull /proc/config.gz ./config.gz
% gunzip config.gz
% mv config .config
% vi .config # or make ARCH=arm menuconfigなど
% make ARCH=arm \
 CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
あとはできたext2.koなどをadbでpush。
% adb push fs/ext2/ext2.ko /data/bin/ext2.ko
/sbin/modinfo fs/ext2/ext2.koしてdependsしている*.koもpushするのを忘れないように。dependsしているmoduleがloadされていないとエラーになります。
# insmod /data/bin/ext2.ko
insmod: init_module '/data/bin/ext2.ko' failed (No such file or directory)
# insmod /data/bin/mbcache.ko
# insmod /data/bin/ext2.ko
これでkernelのversionがあがっちゃってもext2.koなんかを自分で作ることができる。