kernelのコンパイル anchor.png

Samsungで,ソースコードが公開されている。このソースから,Kernelをコンパイルしてみる。

Page Top

ソースコードのダウンロード anchor.png

https://opensource.samsung.com/にソースコードが公開されている。(SC-02BOMKF2のKernel)
ファイル名は,Gingerbread ver2.3.3のKF2がSC-02B_OpenSource.zipで,ver2.3.6のKL4がSC-02B_GB_Opensource_Update.zip。
適当なディレクトリを作成して,

$ unzip SC-02B_OpenSource.zip
$ tar xvfz SC-02B_Kernel.tar.gz

のようにしてzipファイルを解凍すると,kernelのソースコードが展開される。

Page Top

initramfsを準備する anchor.png

通常のLinuxだと,kernel+initramfs=boot.imgなんだけど,Samsungの場合はなぜかkernel+initramfs=zImageみたい。
たぶん,kernelをコンパイル後zImageを作成する時にinitramfsが必要になる。
とりあえず,SC-02BからバックアップしておいたzImageから,fileunpack-initramfsコマンドを使ってinitramfsを抜き出したファイルを使用することにする。

$ unpack-initramfs zImage

これで,ファイルがinitramfsの中のファイルが復元されるんで,ディレクトリをKernelディレクトリがある所にinitramfsというディレクトリを作成して,そこに移動しておく。

Page Top

init.rcの変更 anchor.png

  • ファイルシステムにrfs以外にext4でもマウント出来るようにする
    SC-02Bのオリジナルのままだと,/system,/data,/dbdata等は,rfsでマウントされる。プチフリ対策等で/data,/dbdataなんかをext4に変更したりすると,このままだとマウントできないと思う。
    init.rcを以下のように変更する。(/data部分)
        mkdir /data
    # SEC_DMCRYPT crypt flag added data
        # mount rfs /dev/block/mmcblk0p2 /data nosuid nodev check=no
        mount rfs /dev/block/mmcblk0p2 /data nosuid nodev crypt check=no
        mount ext4 /dev/block/mmcblk0p2 /data noatime data=ordered nodelalloc
        chown system system /data
        chmod 0771 /data
    他の部分(/system,/data,/dbdata)も適当に変更する。
    fota.rcも同様に変更(何に使うんだろ?)
        mkdir /data
        #mount rfs /dev/block/mmcblk0p2 /data nosuid nodev check=no
        mount rfs /dev/block/mmcblk0p2 /data nosuid nodev crypt check=no
        mount ext4 /dev/block/mmcblk0p2 /data noatime data=ordered nodelalloc
    他の部分(/system,/data,/dbdata)も適当に変更する。
    mountコマンドのオプションには,すこしでも早くするために,とりあえずnoatimeをつけてみた。
    • noatimeをつける
      この場合,ファイルにアクセスした時にタイムスタンプを更新しないようにするんで,更新を前提としたアプリケーションでは問題が出る可能性がある。
    • relatimeをつける
      noatimeで問題が出るような場合は,relatimeがいいみたい。relatimeはatimeがcmtimeよりも古い場合にのみ,タイムスタンプを更新する。
  • sd-ext用のマウントポイントを作っておく
    init.rcになくてもイイんだけど,ついでに入れておく。
    # create mountpoints
        mkdir /mnt 0775 root system
        mkdir /mnt/sdcard 0000 system system
        mkdir /mnt/sd-ext 0000 system system
             :
    # Backwards Compat - XXX: Going away in G*
        symlink /mnt/sdcard /sdcard
        symlink /mnt/sd-ext /sd-ext
  • SDカードに作ったext3パーテーションをマウントする
    上で作ったマウントポイントに,このようにして,SDカードのext3パーテーションをマウントする。(HT-03Aで使っていたSDカードのまま。)
  • プロセスがkillされる設定の確認
    AndroidのLinuxカーネルには,メモリの空き容量が少なく(ある一定値以下に)なった場合に,プロセスを殺す仕組みがある。
    カーネルには,その仕組みが2種類のものが実装されていて,一つがOOM(Out Of Memory) Killerという元々のLinuxでの実装と,もう一つLow Memory KillerというAndroid特有の実装がある。
    initramfsにいれるinit.rcを見てみると,
    # Define the oom_adj values for the classes of processes that can be
    # killed by the kernel.  These are used in ActivityManagerService.
        setprop ro.FOREGROUND_APP_ADJ 0
        setprop ro.VISIBLE_APP_ADJ 1
        setprop ro.PERCEPTIBLE_APP_ADJ 1
        setprop ro.HEAVY_WEIGHT_APP_ADJ 2
        setprop ro.SECONDARY_SERVER_ADJ 2
        setprop ro.BACKUP_APP_ADJ 2
        setprop ro.HOME_APP_ADJ 4
        setprop ro.HIDDEN_APP_MIN_ADJ 7
        setprop ro.CONTENT_PROVIDER_MEM 14
        setprop ro.EMPTY_APP_ADJ 15
         :
    # Define the memory thresholds at which the above process classes will
    # be killed.  These numbers are in pages (4k).
       setprop ro.FOREGROUND_APP_MEM 2560
       setprop ro.VISIBLE_APP_MEM 4096
       setprop ro.PERCEPTIBLE_APP_MEM 4096
       setprop ro.HEAVY_WEIGHT_APP_MEM 4096
       setprop ro.SECONDARY_SERVER_MEM 6144
       setprop ro.BACKUP_APP_MEM 6144
       setprop ro.HOME_APP_MEM 6144
       setprop ro.HIDDEN_APP_MEM 10240
       setprop ro.CONTENT_PROVIDER_MEM 11264
       setprop ro.EMPTY_APP_MEM 12288
         :
    # classes will still be killed first.
        write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15
    
        write /proc/sys/vm/overcommit_memory 1
        write /proc/sys/vm/min_free_order_shift 4
        write /sys/module/lowmemorykiller/parameters/minfree 2560,4096,6144,10240,11264,12288
    adjは,プロセスの優先順位みたいで数字が小さいほど優先して実行されるという意味。プロセス毎にこの値を持っているみたい。
    minfreeは,最低限の空きページ数を示していて,1ページは4kB。1536では,1536x4KB=6144KB という意味になるみたい。
    空き容量が,12288ページ(49152KB)以下で,adjが15以上のプロセスはkill
    空き容量が,11264ページ(45056KB)以下で,adjが14以上のプロセスはkill
    空き容量が,10240ページ(40960KB)以下で,adjが7以上のプロセスはkill
    :
    FOREGROUND_APP: 前面で動作中のアプリ
    VISIBLE_APP: ユーザから見えているアプリ
    PERCEPTIBLE_APP: ユーザから認識可能なアプリ。例)バックグラウンドで音楽を再生するアプリ
    HEAVY_WEIGHT_APP: ?
    SECONDARY_SERVER: ?
    BACKUP_APP: ?
    HOME_APP: ホームアプリ
    HIDDEN_APP: たぶん裏に回ったアプリ
    EMPTY_APP: ?
    プロセスチェックは常に行われていて,kernel/drivers/staging/android/lowmemorykiller.cに実装されている。
    # echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree
    とかして,動作中に変更することも出来る。
    適当に好きな値にしておく。
  • BLN用にライブラリをコピーするようにしておく
    /sbin/init_bln.shを作成する。
    #!/system/bin/sh
    if /sbin/busybox [ /res/misc/lights.s5pc110.so -nt /system/lib/hw/lights.s5pc110.so ]
    then
        if /sbin/busybox [ ! -f /system/lib/hw/lights.s5pc110.so.backup ]
        then
            # make backup
            cat /system/lib/hw/lights.s5pc110.so > /system/lib/hw/lights.s5pc110.so.backup
        fi
        # setup liblights
        cat /res/misc/lights.s5pc110.so > /system/lib/hw/lights.s5pc110.so
        #set permissions
        chmod 755 /system/lib/hw/lights.s5pc110.so
    fi
    実行権をつけておく。 init.rcに,
        start setbln
         :
         :
    service setbln /sbin/init_bln.sh
        user root
        oneshot
        disabled
    で/sbin/init_bln.shが自動起動するようにしておく。
Page Top

rootが使えるようにしておく anchor.png

このようにして,rootが使えるようにした。

Page Top

その他の変更 anchor.png

  • Recoveryの変更
    どうもSC-02B(Galaxy S)だとRecoveryはinitramfsに入れておいて,実行するみたいだ。HT-03Aみたいにブートローダーがrecoveryパーテーションから別のlinuxを起動するのではなく,いつも使うlinuxをそのまま使い,recoveryコマンドを起動するだけになっている。
    HT-03Aだと,bootパーテーションとrecoveryパーテーション(独立したlinuxが入っている)が生きていれば,万一Systemを壊したりしてもrecoveryからリストア出来たが,SC-02Bの場合はSystemを壊した場合はRecoveryが起動出来ないと思う。
    このおかげで?,initramfsに入っているrecoveryを入れ替えることもinitramfsを変更すれば可能になる。

    recoveryをClockworkmod3.0.0.5をinitramfsに組み込んだ。これで,HT-03AのようにrecoveryモードでSC-02Bを起動すると,nandバックアップが出来るようになる。
Page Top

Kernelの変更 anchor.png

Page Top

OverClock anchor.png

ここに,Galaxy S(2.6.35.7)用のOC/UV対応パッチがあったんで,入れてみた。ただOCのMaxは1.2GHz :-(
SetCPU等を使って各クロック毎にコア電圧を設定できる。低くするとちょこっと電池持ちがよくなるかも。*1

$ cd Kernel
$ patch -p1 -i ../patch/oc/oc120v400-source.patch
Page Top

BLN対応 anchor.png

SC-02Bはインジケーター用のLEDが搭載されていない。メニューと戻るボタンのタッチパネルのバックライトをインジケーターLEDのように使用する為の変更を入れてみた。 これをダウンロードして,パッチを当てる。

$ cd Kernel
$ patch -p1 -i ../patch/bln/bln_i9000_linux-2.6.35_gingerbread.patch
Page Top

電話の音がおかしくなるのを修正(KF2のみ) anchor.png

コンパイルしてSC-02Bに出来たkernelを焼いて使ってみたら,電話の音がブチブチブチとかいう音になって電話として使えなかった :cry: JJ1から焼き直したりしてみたけど,結局自分で作ったkernelだとダメになっちゃうと言うことがわかった。*2

kernelのソースの音関連を調べていたら,sound/soc/codecsの中にあるファイルで,コンパイルすべきファイルがコンパイルされていないのを見つけた。本来は,たぶんなんだけどwm8994_s1ntt.cをコンパイルすべきところなのだが,wm8994_aries.cをコンパイルしていた。
どうも,sound/soc/codecs/Makefileに問題がある。53行目あたりをとりあえず以下のように変更した,

ifeq ($(SEC_PROJECT_REGION_OPERATOR),S1_JPN_NTT)
  ↓
ifeq ($(CONFIG_ARIES_NTT),y)

これで改めてコンパイルしたら,ちゃんと電話の音が鳴った :-D これってSC-02Bのソースなんだよね,Samsungさん。

Page Top

その他の変更 anchor.png

  • テザリング出来るように変更
    .configをmake menuconfigでルーティングとNAT関連を有効にする。
    USB tethering出来ないようになっている部分をコメント化して使えるようにした。
  • swapパーテーションとzram対応
    swapは,MicroSDのSwapパーテーションとzramを使えるようにした。 swapを使えるようにするには,kernel設定を変更するだけ。
    CONFIG_SWAP=y
    ただ,実際にスワップパーテーションを使ってみたらサクサク感がなくなっちゃうんで,使用するのはやめた。
    MicroSDを早いやつにすれば良いのかもしれない。
    CPUパワーがあるんで,compcacheの方が良い結果が出るかも。と思いcompcache(zramと名前が変わった)を使えるようにもしてみた。
  • IOディスパッチにsio,bfqを追加してデフォルトをsioにしてみた
    sio,bfqのIOスケジュールを追加して,選択出来るようにした。 IOディスパッチを変更するには,adbからか,自動実行シェルスクリプトなんかで,
    # cat /sys/block/mmcblk0/queue/scheduler
    noop deadline cfq bfq [sio]
    で使用できる設定一覧と現在の設定値が表示するので,
    # echo cfq > /sys/block/mmcblk0/queue/scheduler
    のようにして切り替える。
  • その他
    • ext4ファイルシステム周りを変更(KF2)
    • TinyRCUに変更(KF2)
    • Governorをいくつか追加(interactive,conservative,userspace,powersave,ondemand,performance)
Page Top

コンパイル anchor.png

Page Top

コンパイラtoolchain anchor.png

コンパイラー環境は,HT-03Aの時と同じ。(そのままでOK)か,CodeSourceryのサイトからSourcery G++ Lite Edition GNU Toolchain for ARM ProcessorsのEABI用Ver.2009q3-68*3,ダウンロードして使う。

Page Top

コンパイルしてみる anchor.png

$ export LOCALVERSION="-SC02BOMKF2-CL271364" (KF2)
$ export LOCALVERSION="-SC02BOMKL4-CL793915" (KL4)
$ export KBUILD_BUILD_VERSION="xxxx" (日付など・・・)

として環境変数をセット。

設定ファイルの.configを,

$ make mrproper
$ make aries_jpn_defconfig

で,SC-02B用の.configを作成する。

使うコンパイラ設定を,Makefileを変更して記述する。(上記の2009q3-68の場合の例)

CROSS_COMPILE  ?= /opt/toolchains/arm-2009q3/bin/arm-none-linux-gnueabi-
 ↓
CROSS_COMPILE   ?= /opt/toolchains/arm-2009q3/bin/arm-none-eabi-

initramfsを変更した物を使えるようにする。
arch/arm/configs/aries_jpn_defconfigの87行目当たりにある,

CONFIG_INITRAMFS_SOURCE=""
↓
CONFIG_INITRAMFS_SOURCE="../initramfs"

に変更する。(編集したinitramfsがある場所を設定する。)

必要なら通常のLinux設定のように,

$ make menuconfig

でkernel設定を変更する。 これで,準備OK。

$ make

でコンパイルする。
うまくコンパイルできると,arch/arm/bootにzImageが作成される。

module化したものがある場合は,initramfs/lib/modulesに*.koファイルを追加して,再度makeしてinitramfsを統合化してzImageを作ようにする。

$ cp `find ./ -name "*.ko"` ../initramfs/lib/modules/
$ make
Page Top

odin3でflash出来るようにする。 anchor.png

odin3で書き込めるように,zImageをtarファイルにする。

$ cd arch/arm/boot
$ tar cvf sc02bomkf2_yujixxxx.tar zImage

とかしてodin3で書き込めるファイルfilesc02bomkf2_yuji0201.tarを作成する。
SC-02Bをdownloadモードで立ち上げて,odin3で出来たファイルをPDAに指定してflashすれば,SC-02Bに書き込める。

純正ソースから,

  • 1.2GまでのOC
  • BLN対応
  • ext4パーテーション対応と高速化(高速化はKF2のみ)
  • sd-ext使用とuserinit.d対応
  • swapパーテーションでのswap対応
  • zram(compcache)での拡張ram対応
  • tether(USB,WLAN)対応
  • IOスケジュールに,sio,bfqを追加してデフォルトをsioに
  • root化
  • CWMリカバリー搭載

と,純正からあまりいじってないのもあって,動作は安定している。(KL4はまだ試していない・・・)電池持ちもSetCPUを使って,スリープ時のCPU Clockを下げるのと電圧調整で,いろいろ使っても16時間以上は使えている :) 予備バッテリを最初購入して交換しながら使っていたんだけど,もう使わなくなった。

あれ,suとSuperuser.apkがコピーされていない [worried]

cp /res/misc/su > /system/xbin/su
cp /res/misc/Superuser.apk > /system/app/Superuser.apk

とかして,とりあえずコピーした。そのうちinitramfsを変更しないと・・・

04/07/2012 直してみた。でもCWMのnandroidバックアップがなぜか出来ない。どうも,

/sdcard/clockworkmod/backup

ディレクトリが無いのが原因みたい。このディレクトリを作成したらnandroidバックアップ出来た [worried]

KL4は,KernelをKF2と同じ内容でいじってコンパイルとinitramfsも作成してみたんだけど,なんかなぜか/systemがマウント出来ない。しょうがないんでKF2に戻して使っている ;)


*1 低くし過ぎると,動かなくなる
*2 冷静に考えれば当たり前なんだけど・・・
*3 Samsungでは,これでコンパイルしたと,なにかのドキュメントに書いてあった。

コメント一覧

投稿ツリー


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ
(未承認)   投稿日時 2012/1/5 12:25
(未承認)
yuji  投稿日時 2011/11/10 1:35 | 最終変更
はじめまして,hishさん。
CWMですが,sc02bomkf2_yuji0915.tarにはCWM3.0.5が組み込んで有ります。普通にVOL_UP+PowerでCWM Recoveryになるようにしているんですか,動かないですか? 私の所ではHT-03Aと同じようにnandroid backupも使えています。SC-02B(Galaxy S)では,Recoveryを専用のパーテーションから起動するのではなくて,initramfs内にあるrecovery.rcに記述された/sbin/recovery.shをinitにより実行されるようにしています。このような起動の仕方なんで,Recovery時にCWMを実行しないKernel(実際はKernelではなくinitramfsですが)の場合は,nandroid backupしたデータからRestore出来なくなっちゃいます。このへんのところは,やっぱりHT-03Aが良いですね。SC-02B(Galaxy S)でもRecovery用のパーテーションは予約されているんで,ブートローダーが対応すればHT-03Aと同じに出来るんですけどね・・・

もしかして,/cache/recovery/commandが残っているのかもしれませんね,この場合だと標準のRecoveryを起動するようにしています。(/cache/recovery/commandを削除削除すればCWMが動くと思います。)

SD-EXTについては,ここを参考に,/system/etc/init.dにマウントスクリプトを入れてください。05mountsdextを入れると,MicroSDに作成したEXT3を/sd-extにマウントします。
(未承認)   投稿日時 2011/11/8 9:11
(未承認)
yuji  投稿日時 2011/9/30 3:27 | 最終変更
ここに置いてあるファイルは自分用のアーカイブなので,よろしくお願いいたします

はい,自動で/system/app/にSuperuser.apkをコピーします。(suは/system/xbin/にコピー)
私のSC-02Bでは問題ないのですが・・・ adbが使えるのであれば,/res/miscにSuperuser.apkとsuがあるんで,それぞれのディレクトリにコピーしてみてください。

(未承認)   投稿日時 2011/9/29 17:40
(未承認)
yuji  投稿日時 2011/9/27 0:05 | 最終変更
fujitaさん,
こんばんわ。コメントありがとうございます。回答が遅れてすいません。
インフラストラクチャーでのテザリングですが,だいぶ前のビルドしたものから可能になっています。sc02bomkf2_yuji0915.tarでも可能です。(PCにIP Address割り当ても行われます。)
Androidの設定メニューでテザリングの設定メニューを表示するには,別途framework-res.apkとSetting.apkの差し替えが必要になります。ここを参照してみてください。差し替え後は,Settings>無線とネットワーク>Mobile APからデザリングを使用する設定が出来るようになります。
USB接続でのテザリングも出来るようにしてありますが,今のところこの設定をするには,マーケットからTethering Shortcutをインストールして,そこから使用するようになります。
fujjita   投稿日時 2011/9/22 2:45
はじめまして。
SC-02BのインフラファクチャテザリングでPC接続が作動しなくてなぜだろうと思って検索していたら辿り着きました。
こちらにアップされているsc02bomkf2_yuji0915.tarはDHCPが正常に作動するのでしょうか。
どうぞ宜しくお願い致します。



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