1: 2011-07-19 (火) 13:45:36 yuji ソース 現: 2020-12-26 (土) 15:07:42 yuji ソース
Attached file: sc02bomkf2_yuji0201.tar
Line 1: Line 1:
*kernelのコンパイル [#cf986eb9] *kernelのコンパイル [#cf986eb9]
-Samsungで公開されているソースコードから,Kernelをコンパイルしてみる。+Samsungで,ソースコードが公開されている。このソースから,Kernelをコンパイルしてみる。
**ソースコードのダウンロード [#g62549cd] **ソースコードのダウンロード [#g62549cd]
-https://opensource.samsung.com/にソースコードが公開されている。SGH-N013がSC-02Bを表しているようだ。+https://opensource.samsung.com/にソースコードが公開されている。(SC-02BOMKF2のKernel)
-ファイル名は,GT-I9000_OpenSource_GB_Update.tar.gz +ファイル名は,Gingerbread ver2.3.3のKF2がSC-02B_OpenSource.zipで,ver2.3.6のKL4がSC-02B_GB_Opensource_Update.zip。~
適当なディレクトリを作成して, 適当なディレクトリを作成して,
- $ tar xvfz GT-I9000_OpenSource_GB_Update.tar.gz + $ unzip SC-02B_OpenSource.zip 
-で解凍する。さらに, + $ tar xvfz SC-02B_Kernel.tar.gz 
- $tar xvfz GT-I9000_Kernel.tar.gz +のようにしてzipファイルを解凍すると,kernelのソースコードが展開される。
-として,kernelのソースコードを解凍する。+
**initramfsを準備する [#n14eb993] **initramfsを準備する [#n14eb993]
通常のLinuxだと,kernel+initramfs=boot.imgなんだけど,Samsungの場合はなぜかkernel+initramfs=zImageみたい。~ 通常のLinuxだと,kernel+initramfs=boot.imgなんだけど,Samsungの場合はなぜかkernel+initramfs=zImageみたい。~
-kernelをコンパイル後zImageを作成する時にinitramfsが必要になる。+たぶん,kernelをコンパイル後zImageを作成する時にinitramfsが必要になる。
-とりあえず,SC-02BのFlash ROMからバックアップしておいたzImageから,unpack-initramfsコマンドを使ってinitramfsを抜き出す。+とりあえず,SC-02BからバックアップしておいたzImageから,&ref(unpack-initramfs);コマンドを使ってinitramfsを抜き出したファイルを使用することにする。 
 + $ unpack-initramfs zImage 
 +これで,ファイルがinitramfsの中のファイルが復元されるんで,ディレクトリをKernelディレクトリがある所にinitramfsというディレクトリを作成して,そこに移動しておく。 
 + 
 +***init.rcの変更 [#m62a7443] 
 +-ファイルシステムに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-extをマウント]],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が自動起動するようにしておく。 
 + 
 +***rootが使えるようにしておく [#paf74932] 
 +[[このようにして>../root化]],rootが使えるようにした。 
 + 
 +***その他の変更 [#cedb47bc] 
 +-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を[[Clockworkmod:http://www.clockworkmod.com/]]の[[3.0.0.5:http://forum.xda-developers.com/showthread.php?t=839640]]をinitramfsに組み込んだ。これで,HT-03AのようにrecoveryモードでSC-02Bを起動すると,nandバックアップが出来るようになる。 
 + 
 +**Kernelの変更 [#b58bcd31] 
 +***OverClock [#z7e47aae] 
 +[[ここ:https://github.com/existz/galaxys-i9000-OC-kernel-source-patches]]に,Galaxy S(2.6.35.7)用のOC/UV対応パッチがあったんで,入れてみた。ただOCのMaxは1.2GHz :-( ~ 
 +SetCPU等を使って各クロック毎にコア電圧を設定できる。低くするとちょこっと電池持ちがよくなるかも。((低くし過ぎると,動かなくなる)) 
 + $ cd Kernel 
 + $ patch -p1 -i ../patch/oc/oc120v400-source.patch 
 + 
 +***BLN対応 [#c06c8fee] 
 +SC-02Bはインジケーター用のLEDが搭載されていない。メニューと戻るボタンのタッチパネルのバックライトをインジケーターLEDのように使用する為の変更を入れてみた。 
 +[[これ:https://raw.github.com/neldar/backlightnotification/master/kernel_patches/bln_i9000_linux-2.6.35_gingerbread.patch]]をダウンロードして,パッチを当てる。 
 + $ cd Kernel 
 + $ patch -p1 -i ../patch/bln/bln_i9000_linux-2.6.35_gingerbread.patch 
 + 
 +***電話の音がおかしくなるのを修正(KF2のみ) [#n5bdf1ce] 
 +コンパイルしてSC-02Bに出来たkernelを焼いて使ってみたら,電話の音がブチブチブチとかいう音になって電話として使えなかった :cry:  JJ1から焼き直したりしてみたけど,結局自分で作ったkernelだとダメになっちゃうと言うことがわかった。((冷静に考えれば当たり前なんだけど・・・)) 
 + 
 +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さん。 
 + 
 +***その他の変更 [#xafe1a5a] 
 +-テザリング出来るように変更~ 
 +.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)~ 
 + 
 +**コンパイル [#af091748] 
 +***コンパイラtoolchain [#l09e45db] 
 +コンパイラー環境は,HT-03Aの時と同じ。(そのままでOK)か,[[CodeSourcery:http://www.codesourcery.com/]]のサイトから[[Sourcery G++ Lite Edition GNU Toolchain for ARM ProcessorsのEABI用Ver.2009q3-68:http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3053]]を((Samsungでは,これでコンパイルしたと,なにかのドキュメントに書いてあった。)),ダウンロードして使う。 
 + 
 +***コンパイルしてみる [#jc67712d] 
 + $ 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 
 + 
 +**odin3でflash出来るようにする。 [#n58f8476] 
 +odin3で書き込めるように,zImageをtarファイルにする。 
 + $ cd arch/arm/boot 
 + $ tar cvf sc02bomkf2_yujixxxx.tar zImage 
 +とかしてodin3で書き込めるファイル&ref(sc02bomkf2_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に戻して使っている ;)


トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 1067, today: 1, yesterday: 1