内容
@kkasicista 「BC10でUSB wifiを使う」(資料)
bc10とは?
BeagleBoardの設計を元に作成した評価ボード
BeagleBoard rev.C互換
評価ボードよりだけど、持って歩けるように作ってる
GPS、加速度センサを搭載
PSPと同じ解像度の有機ELディスプレイ
Wi-Fiに関しては進化が早く陳腐化しやすいこと、そして技適等の問題から直接基板に
載せず、USB wifiを使うことにした。
今回の手順は、bc10、BeagleBoardの他、xMや自前でビルドしたAndroidであれば、応用が可能
LinuxのWi-Fi環境のおさらい
・Linux Wireless Extension 無線LANドライバー用の共通API
・Wireless tools 上述の操作設定ツール。iwconfig,iwlist,iwpriv等
LinuxでWi-Fiを使えるようにしたプロジェクト。ただし、これらはもう古い
Linux Wireless Extentionは Kernel 2.6.21のWE-22まで。
Wireless ToolsはWEPまでしか設定できなかった。
2) http://wireless.kernel.org/
・mac80211 SoftMACデバイス用の無線LANドライバーAPI
・cfg80211 新しい無線LANドライバー設定API
・nl80211 ユーザー空間 <-> カーネル空間伝送経路
3) http://hostap.epitest.fi/wpa_supplicant/
・WPAサプリカント(嘆願者)
WPA,WPA2接続のクライアント側認証ツール
いろいろな認証方式、鍵管理方式に対応していて、WPSも対応
AndroidのWi-Fi
方法は二通り
1) Wifi Driverとbetcfgやifconfigだけで設定して接続する方法
とりあえず動かしてみる方法
→設定変更にファイルの書き換えとリブート必要
2) external/wpa_supplicant_6とhardware/libhardware_legacy/wifi/wifi.cの修正
しっかりと移植する方法
→AndroidのUIの設定から変更可能
Linuxで使用可能なUSB wifiを探す
Atmark社のArmadillo MLに情報がある。 [Armadillo:06243] 参照
1番目の方法 : まずは動かしてみる - Ralinkのchip使用のUSB wifiの例
1) Wifi Driverをカーネルビルドしたのと同じようにクロスコンパイル
2) ファームウェアに必要な設定をして読み込める場所におく
/etc/wireless/....
3) 起動スクリプトの最後に以下の設定を呼び出すように書く
・ insmod rt4470sta.ko
・netcfg ra0 dhcp
・setprop net.dns1 x.x.x.x
設定の度に変更する必要があるので、非効率
2番目の方法: こちらが本来の目指すべき手順
open source projectにWifiのポーティング方法が書かれている
wpa_supplicantの改造版 - オリジナル版から改造がされている
・windows、symbian用のソースを除去
・srcの階層が変更され、android.mkがある
・SSIDがUNICODE対応
・BlackListに対応(接続できないAPを設定から外す)
・driver_cmd
AndroidはSIOCSIWPRIV ioctlを使ってWifiドライバにコマンドを送って
driverの挙動をかえたり、信号強度やAPのMACアドレスやリンク速度の情報を取得したりする
LinuxではiwlistやNetworkManagerなどで行う事をdriver内でやっている
AndroidではWifiのon/offをinsmod/rmmodで行っている
ここで、問題点
・SIOCSIWPRIV ioctlを実装してあるwifi driverはほとんどない
msm kernelのdriver/wireless/bcm4329 wl_iw.cのwl_iw_set_priv
・USB Driverだとそもそもchipが対応してないものも
この件に関しては以下のサイトが参考になる
http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html
@kinnekoさんがWifiのポーティングサイトの訳を公開してくれている
@nekomeshi312 「CE Linux Forum Japan Technical Janmoress#35」(資料)自己紹介
- 昔、Windowsアプリやさん、現在、仕様書書き。
- Linuxは素人
Linux素人がなぜ参加したか
- PF部第二回勉強会の CELF#34レポートが面白かったから
- 面白くない研修に行かされそうだったので休暇申請だしたら休めちゃった
プログラム内容とつぶやき
http://elinux.org/Japan_Technical_Jamboree_35
・Opening/連絡事項
CE Linux Forumは、Linux FoundationのWGの一つになるため、今回がCELFとしてのJamboreeの最後
・Event report(Kernel summit and more) - Embedded Linux Mini Summitの報告
・SoCベンダごとのカーネルツリーが乱立
・xBoot ARMでLinuxを直接ブートしたい
・2.6.35をembeddedのstableにしたい(決定ではない)
・Tim Bird Latest Community topics update
・Stable tracing APIs
・TTY-based group scheduling
・Checkpoint/restart for Applications
アプリの起動が早くなる・・かも
・Bootchart2
Bootchartのほとんど書きなおし。視覚化はPython
・Syslink
・Tim Bird Least CELF development project update
・Smemcap in busybox
・Bootchart in busybox
・YAFFS2 mainlineへ
・Trace format standard
・@tetsu_koba Init of Android
init祭りの続き・・・というかリベンジ
http://blog.kmckk.com/archives/3137191.html
横浜Android Platform部の紹介(ありがとうございます)
initは、ルート直下のため、bootargsにinit=/initを忘れないように
initのソースは、system/core/init下
initの処理は大きく2つの部分に分かれる。ブート処理部とデーモン処理部
・device_fd
カーネルからのデバイス状態変化の通知を受けて、udevdのような処理を行う
・property_set_fd
システムプロパティの書き込み処理
・signal_recv_fd
子プロセスが終了したときの処理
・keychord_fd
複数のキーの入力の組み合わせを監視し、サービス起動を行う?
・Statistics tells something about Linux Community!
・現在のLinuxのサイズ、34,297ファイル、70.3MB
ただし、2nd Directoryを見ると、driver 51.2%、arc 21.8%、kernel 1.23%
ということでちゃんと見れば読めるサイズです。
・メンテナ数 2.6.10 : 310人 → 2.6.35 : 847にん
・Kconfig file 2.6.10 : 250程度 → 2.6.35 : 693個
・Configuration item 2.6.10 : 5000程度 → 10,484個
・An Impression of Linux embedded gadget
・Windows systemはX-Windowは終わり、代わりにWayland
・Sensor Device は、色々足りてないよね。
・SoC Specific code 2.6.36でだいぶ整理が足りたので、ARM以外は大丈夫?!
・It’s my idea! kexec-tools for busybox
Kernelから別のKernelを起動する。
Kernel-toolsはそのユーザーランド?(よくわかりません)
Web担当者注釈
kexecというのは、nekomeshi312さんが述べられた通り、Kernelから別のKernelを起動するためのKernelパッチです。これで何ができるかというと、PCでいうとBIOS, 組込みの場合u-bootのようなブートローダが受け持つデバイスのリセット処理をすっ飛ばして、Linuxカーネルに移れるため、高速な再起動ができるようになります。
これを応用すると、Ubuntuに最適化されたKernelで起動した状態から、Androidのカーネルとinitに切り替えるという事もできそうなのですが、既に動いてるハードの情報をどのように別のカーネルに受け渡すのか等、結構難しいもののはずです。
busybox向けのアイディアのようですが、どんな内容だったんでしょうねぇ。
・今後の予定
2011/03/18, 05/20, 09/30, 12/09
@sola_dolphine_1 「Android 2.3での変化点」(資料)
内容
Android 2.3を載せてみたときに気がついた点や、脱線して調べた内容
init.rcの違い その1 fsに関する追加
on ~としてfs関連が追加されてる
- fs
- early-fs
- post-fs
on fs
system, data, cacheのマウントを行う
以前までは、on initの中で行われていた
beagle 2.3でon fsの中身をコメントアウトするとカーネルパニックを起こす
on fsの記述毎コメントアウトすると治る
→ on fsの中には何かコマンドがないとまずそう?
コメントアウトしなくとも、そもそもマウント先がないのでマウントに失敗してそのまま起動する。
→ ちょっと気持ちが悪い
エラーになっている箇所
system/core/init/init.c:508
on early-fs
on fsより先に実行される
公開されているinit.rcでは使われていない。何のために使用する?
(Web担当注釈 → 場合によってはmount用のディレクトリをmkdirするとかかな)
on post-fs
概ね2.2までのon initからon fsとon early-fsの個所を除いた部分
* ちょっと脱線
TIで公開されているBeagleBoardの起動方法では、rootは1つのパーティションで、パーティションを分けていない。これだと、on fsの動作の検証ができないため、ramdiskを使用して起動できるようにしてみた。
ramdisk.img
Androidをビルドでできる
out/target/product/beagleboard/ramdisk.img
u-bootで使えるように作り直す必要がある
$mkimage -A arm -O linux -T ramdisk -C none -a 0x81000000 -n “Android Root Filesystem” -d ./ramdisk.img ./myramdisk.img
init.rc の編集
on fs
mount ext4 /dev/block/mmcblk0p3 /system
mount ext4 /dev/block/mmcblk0p3 /system ro remount
mount ext4 /dev/block/mmcblk0p5 /data nosuid nodev
mount ext4 /dev/block/mmcblk0p6 /cache nosuid nodev
Android 2.3からext4のsystem.imgを作成可能。ちょっと探したらツールがあった。
ツール : out/host/linux-x86/bin/make_ext4fs
- 例 system.imgを作成/書き込み
$make_ext4fs -l 128M system.img system
$sudo dd if=system.img of=/dev/sdb3
Web担当注釈:
ちなみに、当たり前のように省略されていますが、fdiskで事前にパーティションを分けておく必要があります。なお、BeagleBoardはFAT内からMLOやu-boot.binを探すので、第一パーティションにFAT,第二パーティション以降にLinuxのパーティションを3つ作る必要があります。
ついでに、FAT領域をもう一つ用意しておいて、vold.fstabをいぢると、SDカードとして認識する領域も作れます。Tryしてみて下さい。
init.rcの違い その2 lowmemorykiller
メモリ不足時の殺し屋
init.rcで優先度の設定をしている値に変化あり
○ ADJ : 設定項目が増えている
○ MEM :ページ数が増えている
・メモリ不足時に呼ばれ、イカの処理を行う
a. 空きページ数を調べる
b. 空きページ数がminfreeに設定した値よりも小さくなる個所を探す。これをmin_adjとして覚えておく
c. 全プロセスを検索し、各プロセスのoom_adjとmin_adjを比較。min_adj以上の値を持つプロセスと、そのメモリサイズを覚える
d. 殺すプロセスを選んで、シグナル発行。殺す基準は、最もメモリを使っている & oom_adjの値が最大
実際のコードは、 drivers/staging/android/lowmemoryliller.c
コード量は大した事が無いので興味があれば見ると良い。
・動作例 : min_adj値の決定の解説
・動作例 : 殺すプロセスの検索の解説
・oom_adjの設定、確認方法
/proc/N/oom_adj を読み書きすればよい
・殺す対象から外す
oom_adjに-17を設定すると対象外
・oom_adjは、デフォルトで0でシステム状態によって変動する(はず)
lowmem_shrink
shlink_listに関数を登録
メモリ解放のために、shrink_slabはshrinker_listに登録されている関数を呼び出す
ここで登録したlowmem_shrinkerが呼び出される
init.rcの違い その3 early-initとearly-boot
Android2.2までにもあったが使用されていなかった
early-init
2.3から追加されたueventedで使われている
(Web担当より、ごめん・・・先に言っちゃって)
・ueventdの起動は、argv[0]で判別している
・ueventdの役割
2.2まではdevice.cで行っていた処理
情報は過去のPF部資料にアリ
・init.rc同様、機種ごとにファイルを作れる。ueventd.omap3.rc
early-boot
init.lowmem.rcに記述があり
でもこのファイルは読み込まれない
将来的につかえるのかテンプレート?
誰か知ってたら教えて下さい。
@sabakawa 「ARM Hibernation調査(前半部分)」 (資料)
自己紹介と発表内容について@sabakawa
裸基盤大好きな人。あまりAndroidとは関係のない仕事をしています。
発表内容は、実際はAndroidである必然性のない話で、Linuxカーネルのメモリ管理に関する内容。現在も調査・開発中です。この会でも同じ話題で会話ができたら嬉しいなと思い発表させていただくことにしました。
ハイバネーションとは・最終形は組込み機器の待機電力ゼロを目指す
ノートパソコンでは残電力が少なくなるとハードディスクに状態を保存し、電源復旧後に起動すると使用状態も復旧する用になっている。
スマートフォンでは、まだ実装されているものが無い。個人的には必須の機能だと思っている。
・目立って来ているARM Androidの高速起動ソリューション
最近はハイバネーションのおまけ的な機能であるこちらの方が目立っている。・ユビキタスさん 「Quick Boot」
・リネオさん 「Warp!!」
Web記述者注釈:
ユビキタスさんは、ABC2009FallでもQuick Bootを紹介してくださっていたかと思います。日本Androidの会の技術資料にも資料がありますね。このときの発表を目の前で見ましたけど、実際、cold bootから、1秒起動は衝撃でした。
この手の機能がスマートフォンになかなか来ない理由は、おそらく端末毎にブートローダにも、カーネル回りにもカスタマイズが必要で、バージョンアップ等も含めるとその対応のコストパフォーマンスから、想定している開発費の範囲にいれこめないのじゃないかとか思っています。
とはいえ、電池残量が少ない時は頻繁に電源を切る場合もあるので、そういうときには欲しい機能なんですけどねぇ。どこか搭載端末出してみてくれないものかなぁ。
ハイバネーションの仕組み物理メモリはLinuxカーネル内で抽象化されて管理されている
ハイバネーションはこの物理メモリと内部レジスタをストレージに保存して再仮想化する技術
ZONE構造体Linux 2.4から導入された概念。メモリの断続的な実装が発生したため、ゾーン分けして管理するようになった。(個人的には大容量メモリへの対応かな?ととらえている)
保存メモリの最適化使用中のメモリだけを保存/読み込みすることで高速起動に寄与
具体的には、free_areaに管理されているPFNにしるしをつけて保存の対象に入れない様にしている。
Web記述者注釈:
ちなみに、以前の発表や月刊インターフェースの記事等によると、Quick Boot等は、読み込みの時も最適化を行っていて、必要な所をまず先にリストアしていき、すぐに使わない部分等は後回しにするなどの方法でさらに高速化しているようです。
保存先についてPCなら保存先はIDEインターフェース先となる。
組込み機器の場合、NAND/NOR FLASH, PCMCIA先のストレージ、IDEインターフェース先のハードディスク等色々考えられる。
Web記述者注釈:
NORは書き込み速度の問題で、NANDは書き込み回数上限の問題で微妙でしょうね。高速起動だけを目的とし、バージョンアップ毎の最新イメージのみならありですが。
おそらく、ユーザー向けSDカードスロットとは別にもう1つSDカードスロットをつける等の方法で実現する事になるのではないでしょうか。
今回の発表について今できているのはこの保存部分までです。
次回は再開処理ができたら報告します。
会場をおさえられたのが、2月11日(祝日)15:00〜となります。
@myb1126 「MonkeyRunnerの仕組みについて(仮)」
@hermit4 「直前までに何か考えます」 (たぶんinitのそれから、それから)
@kishima 「Google TV(仮)」
@sekitoba 懇親会で誰かさんの罠にはまって何か発表予定
本記録について凍えるような寒さのなか向かった先にあったその店は!
既に売り切れている焼き物の数々、蘇る過去の記憶
まさかのメニューにない麻婆豆腐「激辛」注文の行方はイカに
というわけで、「変態だ!」といわれながらも集まるPF部の物好き達は、中華街のとあるお店(2回目)で、わいわいやってきました。
@iwata_n さんがBlogで公開してくださったメモをもとに、@hermit4が転記・コメント入れさせていただきました。誤字、問題点、間違い等ありましたら、@hermit4にtweetかD下さい。