kernelのコンパイル anchor.png

Androidのkernelをソースからコンパイルしてみる。

Page Top

Android repoの設定~ anchor.png

  • 自分のホームにbinディレクトリが必要
    mkdir -p ~/bin 
  • androidのgitリポジトリを設定
    curl http://android.git.kernel.org/repo > ~/bin/repo 
    chmod a+x ~/bin/repo
    ログインし直すと,$PATHにbinが設定されているのを確認する。
Page Top

AndroidのソースコードをDownloadする anchor.png

  • ワークディレクトリを作る~ mkdir -p ~/android/system
    cd ~/android/system 
  • ソースをダウンロードする(CyanogenModのソースにしてみる)
    repo init -u git://github.com/CyanogenMod/android.git -b gingerbread
    repo sync 
  • コンパイラ環境を設定する
    export CCOMPILER=${HOME}/android/system/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
Page Top

実際にkernelをコンパイル anchor.png

  • ワークディレクトリを作る
    mkdir -p ~/android/kernel 
    cd ~/android/kernel 
  • カーネルのソースコードをgitでDownloadする
    git clone git://github.com/CyanogenMod/cm-kernel.git 
  • その後,kernel .configをHT-03Aから持ってくるか,menuconfigなんかで作成する。
    • 端末から持ってくる場合
      cd cm-kernel 
      adb pull /proc/config.gz /home/user_name/androkern/cm-kernel/config.gz 
      gunzip config.gz && mv config .config
    • kernel.imgから抜き出す場合
      scripts/extract-ikconfig boot.img > .config
    • configし直す場合
      用意した.confgファイルを元に適当に設定する。.configがないと最初から設定しなおしになる。
      make ARCH=arm CROSS_COMPILE=$CCOMPILER oldconfig 
      もしくは,
      make ARCH=arm CROSS_COMPILE=$CCOMPILER menuconfig 
      とかして,.configを作成する。
  • kernelをコンパイルする
    make ARCH=arm CROSS_COMPILE=$CCOMPILER -j`grep 'processor' /proc/cpuinfo | wc -l`
    結構時間がかかる。
    kernelは,~/android/kernel/cm-kernel/arch/arm/boot/zImage に保存される。
Page Top

WiFi kernelモジュールのコンパイル anchor.png

なぜかこの状態だとwifiが不安定になるらしい。
wifiドライバーをモジュールとしてコンパイルして,それをリンクするようにする。

  1. cd ~/android/system/system/wlan/ti/sta_dk_4_0_4_32
  2. KERNEL_DIR=~/android/kernel/cm-kernel CROSS_COMPILE=$CCOMPILER ARCH=arm make -j`grep 'processor' /proc/cpuinfo | wc -l`
    でコンパイルする
  3. できたモジュールのファイルを上書きして変更する。
    adb shell mount -o remount,rw /system~
    adb shell cp /system/lib/modules/wlan.ko /system/lib/modules/wlan.ko.backup~
    adb push wlan.ko /system/lib/modules/wlan.ko~
    リブートすれば,新しいwlan.koをkernelが使うようになる。
Page Top

boot.imgの作成 anchor.png

Page Top

filesystem anchor.png

HT-03AにはFlash ROM上に,以下のようなROMパーテーションが作られている。

cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 05a00000 00020000 "system"
mtd4: 05000000 00020000 "cache"
mtd5: 127c0000 00020000 "userdata"

mtd3=/system,mtd4=cache,mtd5=/dataにそれぞれmountされる。
mtd2はboot時使われるファイルで,mtd1はリカバリーモードで使われる。

一応,"recovery"と"boot"をバックアップしておく

#cat /dev/mtd/mtd1 > /sdcard/mtd1.img
#cat /dev/mtd/mtd2 > /sdcard/mtd2.img

端末の/system/recovery.imgは,毎回シャットダウンする時にmtd1(recoveryパーテーション)に,自動的に焼かれる。この理由は,

  • まちがってmtd1を変に書き換えちゃった時に,文鎮化するのを防ぐ為
  • mtd1を入れ替えたい場合などに,/system/recovery.imgに入れておくことで,安全に変更できる
    と思われる。通常は,/system/recovery.imgを入れておかないようにする。
Page Top

bootイメージ anchor.png

bootイメージは,linuxのブート時に使用されていて,

  1. 2kのAndroid用ヘッダー
  2. gzip圧縮されたkernel
  3. システムを初期化するためなどに使用される,基本的なコアファイルを入れてあるramdisk
  4. 2ndステージローダー(オプション) がbootイメージに入っている。

kernelをコンパイルした後,kernelファイルとこれらのファイルをマージしてboot.imgを作成する。
これをmtd2にflashすると,bootloaderがkernelを起動してくれる。

boot.img用のアンパックとマージには,fileunpack-bootimg.zipfilerepack-bootimg.zipを使うことが出来る。

Page Top

boot.imgの分解 anchor.png

とりあえず今あるboot.imgを分解して,kernelとramdiskにわける。
最初の2kbyteを飛ばして0x1F8B(gzipのヘッダー)を見つける,次の0x1F8Bまでがkernelになる。
その次の0x1F8Bまでがramdiskになる。バイナリエディター等やddなんかで書き出せば取り出せる。ファイルはgzip圧縮されているんで解凍すれば,ramdiskに中にあるファイルを編集できるようになる。

gunzip -c ../your-ramdisk-file | cpio -i

上の,unpack-bootimgを使うほうが簡単だけど・・・

ramdiskを編集したら,コンパイルしたkernelと共に再度パッキングする。
まず,ramdiskをgzipで圧縮する。

find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz

新しいkernelとマージする。

mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel 新しいkernel --ramdisk newramdisk.cpio.gz -o myboot.img

上の,repack-bootimgを使うほうが簡単だけど・・・

もしくは,filesplit_bootimg.zipも使える。 分解するときは,

% ./split_bootimg.pl boot.img 
% mkdir ramdisk
% cd ramdisk
% gzip -dc ../boot.img-ramdisk.gz | cpio -i
% cd ..

とやって,作業後マージするには,

% mkbootfs ./ramdisk | gzip > ramdisk-new.gz
% mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o myboot.img

でマージする。

Page Top

HT-03Aに新しいboot.imgをflashする anchor.png

/sdcardに新しいイメージをコピーする

adb push ./myboot.img /sdcard

adb shell上で,

# cat /dev/zero > /dev/mtd/mtd2

で,bootパーテーションを綺麗サッパリ消してから,

# flash_image boot /sdcard/myboot.img

として,書き込む。 リブートして,ちゃんとブートすればOK。ダメだったら,リカバリモードで前に戻す。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 610, today: 1, yesterday: 0
最終更新: 2020-12-26 (土) 16:08:16 (JST) (1215d) by yuji