3: 2011-07-23 (土) 03:29:05 yuji ソース
Attached file: sc02bomkf2_yuji02.tar, Deleted an attach file: sc02bomkf2_yuji02.tar at 2011-07-23 (土) 16:41:24
現: 2020-12-26 (土) 15:07:42 yuji ソース
Attached file: sc02bomkf2_yuji0201.tar
Line 1: Line 1:
*kernelのコンパイル [#cf986eb9] *kernelのコンパイル [#cf986eb9]
-Samsungで,OMKF2のソースコードが公開されたみたいだ。このソースから,Kernelをコンパイルしてみる。+Samsungで,ソースコードが公開されている。このソースから,Kernelをコンパイルしてみる。
**ソースコードのダウンロード [#g62549cd] **ソースコードのダウンロード [#g62549cd]
https://opensource.samsung.com/にソースコードが公開されている。(SC-02BOMKF2のKernel)~ https://opensource.samsung.com/にソースコードが公開されている。(SC-02BOMKF2のKernel)~
-ファイル名は,SC-02B_OpenSource.zip~+ファイル名は,Gingerbread ver2.3.3のKF2がSC-02B_OpenSource.zipで,ver2.3.6のKL4がSC-02B_GB_Opensource_Update.zip。~
適当なディレクトリを作成して, 適当なディレクトリを作成して,
 $ unzip SC-02B_OpenSource.zip  $ unzip SC-02B_OpenSource.zip
 $ tar xvfz SC-02B_Kernel.tar.gz  $ tar xvfz SC-02B_Kernel.tar.gz
-で解凍すると,kernelのソースコードが展開される。+のようにしてzipファイルを解凍すると,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からバックアップしておいたzImageから,&ref(unpack-initramfs);コマンドを使ってinitramfsを抜き出したファイルを使用することにする。 とりあえず,SC-02BからバックアップしておいたzImageから,&ref(unpack-initramfs);コマンドを使ってinitramfsを抜き出したファイルを使用することにする。
- $ ./unpack-initramfs zImage+ $ unpack-initramfs zImage
これで,ファイルがinitramfsの中のファイルが復元されるんで,ディレクトリをKernelディレクトリがある所にinitramfsというディレクトリを作成して,そこに移動しておく。 これで,ファイルがinitramfsの中のファイルが復元されるんで,ディレクトリをKernelディレクトリがある所にinitramfsというディレクトリを作成して,そこに移動しておく。
Line 25: Line 25:
     # mount rfs /dev/block/mmcblk0p2 /data nosuid nodev check=no      # mount rfs /dev/block/mmcblk0p2 /data nosuid nodev check=no
     mount rfs /dev/block/mmcblk0p2 /data nosuid nodev crypt check=no      mount rfs /dev/block/mmcblk0p2 /data nosuid nodev crypt check=no
-     # ext4 support by Yuji 
     mount ext4 /dev/block/mmcblk0p2 /data noatime data=ordered nodelalloc      mount ext4 /dev/block/mmcblk0p2 /data noatime data=ordered nodelalloc
     chown system system /data      chown system system /data
     chmod 0771 /data      chmod 0771 /data
他の部分(/system,/data,/dbdata)も適当に変更する。~ 他の部分(/system,/data,/dbdata)も適当に変更する。~
-fota.rcも同様に変更+fota.rcも同様に変更(何に使うんだろ?)
     mkdir /data      mkdir /data
     #mount rfs /dev/block/mmcblk0p2 /data nosuid nodev check=no      #mount rfs /dev/block/mmcblk0p2 /data nosuid nodev check=no
     mount rfs /dev/block/mmcblk0p2 /data nosuid nodev crypt check=no      mount rfs /dev/block/mmcblk0p2 /data nosuid nodev crypt check=no
-     # ext4 support by Yuji 
     mount ext4 /dev/block/mmcblk0p2 /data noatime data=ordered nodelalloc      mount ext4 /dev/block/mmcblk0p2 /data noatime data=ordered nodelalloc
他の部分(/system,/data,/dbdata)も適当に変更する。~ 他の部分(/system,/data,/dbdata)も適当に変更する。~
 +mountコマンドのオプションには,すこしでも早くするために,とりあえずnoatimeをつけてみた。
 +--noatimeをつける~
 +この場合,ファイルにアクセスした時にタイムスタンプを更新しないようにするんで,更新を前提としたアプリケーションでは問題が出る可能性がある。
 +--relatimeをつける~
 +noatimeで問題が出るような場合は,relatimeがいいみたい。relatimeはatimeがcmtimeよりも古い場合にのみ,タイムスタンプを更新する。
 +
-sd-ext用のマウントポイントを作っておく~ -sd-ext用のマウントポイントを作っておく~
init.rcになくてもイイんだけど,ついでに入れておく。 init.rcになくてもイイんだけど,ついでに入れておく。
Line 47: Line 51:
     symlink /mnt/sdcard /sdcard      symlink /mnt/sdcard /sdcard
     symlink /mnt/sd-ext /sd-ext      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の変更~ -Recoveryの変更~
どうもSC-02B(Galaxy S)だとRecoveryはinitramfsに入れておいて,実行するみたいだ。HT-03Aみたいにブートローダーがrecoveryパーテーションから別のlinuxを起動するのではなく,いつも使うlinuxをそのまま使い,recoveryコマンドを起動するだけになっている。~ どうもSC-02B(Galaxy S)だとRecoveryはinitramfsに入れておいて,実行するみたいだ。HT-03Aみたいにブートローダーがrecoveryパーテーションから別のlinuxを起動するのではなく,いつも使うlinuxをそのまま使い,recoveryコマンドを起動するだけになっている。~
HT-03Aだと,bootパーテーションとrecoveryパーテーション(独立したlinuxが入っている)が生きていれば,万一Systemを壊したりしてもrecoveryからリストア出来たが,SC-02Bの場合はSystemを壊した場合はRecoveryが起動出来ないと思う。~ HT-03Aだと,bootパーテーションとrecoveryパーテーション(独立したlinuxが入っている)が生きていれば,万一Systemを壊したりしてもrecoveryからリストア出来たが,SC-02Bの場合はSystemを壊した場合はRecoveryが起動出来ないと思う。~
このおかげで?,initramfsに入っているrecoveryを入れ替えることもinitramfsを変更すれば可能になる。~ このおかげで?,initramfsに入っているrecoveryを入れ替えることもinitramfsを変更すれば可能になる。~
-この時点で,必要ならrecoveryをCWMとかに変更しておく。+
 +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]+**Kernelの変更 [#b58bcd31]
***OverClock [#z7e47aae] ***OverClock [#z7e47aae]
[[ここ:https://github.com/existz/galaxys-i9000-OC-kernel-source-patches]]に,Galaxy S(2.6.35.7)用のOC/UV対応パッチがあったんで,入れてみた。ただOCのMaxは1.2GHz :-( ~ [[ここ:https://github.com/existz/galaxys-i9000-OC-kernel-source-patches]]に,Galaxy S(2.6.35.7)用のOC/UV対応パッチがあったんで,入れてみた。ただOCのMaxは1.2GHz :-( ~
Line 65: Line 157:
 $ cd Kernel  $ cd Kernel
 $ patch -p1 -i ../patch/bln/bln_i9000_linux-2.6.35_gingerbread.patch  $ 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] **コンパイル [#af091748]
- $ export ARCH="arm+***コンパイラtoolchain [#l09e45db] 
- $ export LOCALVERSION="-SC02BOMKF2-CL271364+コンパイラー環境は,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では,これでコンパイルしたと,なにかのドキュメントに書いてあった。)),ダウンロードして使う。 
- $ export KBUILD_BUILD_VERSION="01"+ 
 +***コンパイルしてみる [#jc67712d] 
 + $ export LOCALVERSION="-SC02BOMKF2-CL271364" (KF2) 
 + $ export LOCALVERSION="-SC02BOMKL4-CL793915" (KL4) 
 + $ export KBUILD_BUILD_VERSION="xxxx" (日付など・・・)
として環境変数をセット。~ として環境変数をセット。~
-コンパイラー環境は,HT-03Aの時と同じ。(そのままでOK)+設定ファイルの.configを, 
 + $ make mrproper 
 + $ make aries_jpn_defconfig 
 +で,SC-02B用の.configを作成する。
- $ cd Kernel +使うコンパイラ設定を,Makefileを変更して記述する。(上記の2009q3-68の場合の例) 
-arch/arm/configs/aries_jpn_defconfigの83行目当たりにある,+ 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=""
 ↓  ↓
 CONFIG_INITRAMFS_SOURCE="../initramfs"  CONFIG_INITRAMFS_SOURCE="../initramfs"
-に変更する。+に変更する。(編集したinitramfsがある場所を設定する。)
- $ make mrproper +必要なら通常のLinux設定のように,
- $ make aries_jpn_defconfig +
-で,.configを作成する。必要なら+
 $ make menuconfig  $ make menuconfig
でkernel設定を変更する。 でkernel設定を変更する。
-これで,+これで,準備OK。 
 + $ make 
 +でコンパイルする。~ 
 +うまくコンパイルできると,arch/arm/bootにzImageが作成される。 
 + 
 +module化したものがある場合は,initramfs/lib/modulesに*.koファイルを追加して,再度makeしてinitramfsを統合化してzImageを作ようにする。 
 + $ cp `find ./ -name "*.ko"` ../initramfs/lib/modules/
 $ make  $ make
-でコンパイル出来た。~ 
-うまくコンパイルできると,Kernel/arch/arm/bootにzImageが作成される。 
**odin3でflash出来るようにする。 [#n58f8476] **odin3でflash出来るようにする。 [#n58f8476]
-odin3で書き込めるようにtarファイルにする。 +odin3で書き込めるように,zImageをtarファイルにする。 
- $ tar cvf sc02bomkf2_yujixx.tar zImage + $ cd arch/arm/boot 
-とかしてodin3でPDAで出来たファイル&ref(sc02bomkf2_yuji02.tar);を指定してflashすれば,SC-02Bに書き込める。+ $ 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を変更しないと・・・
-*焼いたらおかしくなった [#c93d5dba] +04/07/2012 直してみた。でもCWMのnandroidバックアップがなぜか出来ない。どうも, 
-上記でkernelをコンパイルした後SC-02Bに焼いて,普通に立ち上がって使っていたんだけど,なんと電話をかけようとしたら,ブチブチというノイズしか出ないくて,相手の話もこちらの声も話せない :-( ~ + /sdcard/clockworkmod/backup 
-他の機能は問題なかったんだけどな。+ディレクトリが無いのが原因みたい。このディレクトリを作成したらnandroidバックアップ出来た &worried;
-いろいろやっても直せなかったんで,JJ1に戻してみたり,いろいろしちゃった。 ;(  まいったなぁ・・・~ +KL4は,KernelをKF2と同じ内容でいじってコンパイルとinitramfsも作成してみたんだけど,なんかなぜか/systemがマウント出来ない。しょうがないんでKF2に戻して使っている ;)
-わかったことは,自分でKF2をコンパイルしたkernelだと,電話での音がおかしくなるってこと。+


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