- http://atnd.org/events/15330
- まとめ: http://sites.google.com/site/kernelvm/ima-made-no-matome/di-liu-hui-kaneru-vm-tan-jian-dui
- まとめ: http://d.hatena.ne.jp/orangeclover/touch/20110523/1306147041
13:00-13:15 開会・当日の流れの説明・その他諸注意
13:15-16:15 Main Session: (30min発表、10min質疑)
@tetsu_koba「Android is not just ‘Java on Linux’」
[2011-05-22 13:10]
- Java is the first class citizen in Android.
- Java API中心
- native activity (ゲームの移植がかんたんになるように)
- Typical Directory tree of Android
- / (initrd そのまま)と /System (yaff2)はread only
- /initはstatic link
- Bionic: libc, libm pthread, dynamic linker (linker implicitly have crash dump function)
- http://kobablog.wordpress.com/2011/05/12/debuggerd-of-android/
- C++例外はRTTIはサイズがおおきくなるのでサポートしてない。NDKではスタティックリンクしろ。
- Prelinking
- locate dynamic link libraries ahead of time.
- ライブラリの追加削除を考えなくてよい。
- 3GBにライブラリをならべてもあふれないと仮定できる。
- Zygote (ザイゴット;受精卵?)
- Dalvik VMが必要なclassをロードしているのでdynamic link librariesもロード済み。
- child processもロード済みに。
- exec syscallはつかってない。
- Dalvik VM
- java byte codeから dex codeへの変換はホストでやる
- 16bit register basedd
- レジスタ: 命令は多くなるが、命令数は減らせるメリットがある。
- JIT,concurrent GCもはいった。
- Java class lib
- Java MEとはちがう。Java SEににている。
- 自前class loaderをつかうときには注意。dex codeをどうやって生成するか?
- JRubyではJITをoffにしているのでは?
- Linux kernel
- なぜBSDをつかわなかったか? ドライバがいろいろあるからか? ユーザ空間はapacheライセンスがほとんどなのに。
- /dev/binder
- basement of inter process method invocation
- not forgeneral purpose. tuned for specific transaction.
- multithread aware: have internal date per thread. (ソケットならファイルディスクリプタではない)
- ioctlいっぱつでreadとwriteができる。
- ashmem
- android /anonymouse shared memory subsystem
- pin_region/unpin_region: unpinするとカーネルがメモリ逼迫時に捨ててくれる Java weak refっぽい。 Image Decoderのキャッシュでつかわれている。
- wake lock
- sleep modeにはいらないようにロックする
- alarm
- sleep modeにはいっていてもおきる
- low memory killer
- アプリのライフサイクルで画面から消えたらセーブするように決められている。
- logger
- system wide log いろいろなのが容易されている
- build system
- これだけの規模のものが手順にしたがってビルドできるのがすごい。
- まとめ
- 既存のディストリビューションからの引き算ではなくて、linux kernelに必要なものを足していった。
[2011-05-22 13:42]
@m_asama「Netfilter(iptables) で Winny/Share 検知」
[2011-05-22 13:46]
- 「winny/shareをつかってるひと!手を挙げて!」
- IPP2P: P2P通信を検知するためのnetfilterの機能拡張 (非標準)
- eDonky, eMule, Kadamlia, KaZaA, BitTorrentなどに対応
- Winny/Shareには対応してない
- BitTorrentの検出方法: "BitTorrent protoco"という文字列があるかみる。
- Winny/Share: 暗号化されているのでパターンマッチングはむつかしい
- pre shared keyはないので最初からおいかければ復号できる。
- table: {src,dst, init seq, デコードして判別結果}
- IPP2Pでは状態管理をしてない。(セッション管理)
- netfilterのconntrack: tcp/udpの接続情報を追跡。FTPの制御コネクションをみてデータコネクションとかPPTPの接続情報からGREのNAT設定をしたり。
- sk_buffに情報がうめこまれるのでiptablesモジュールからも参照可能
- nf_conntrack_ipp2pをつくってwinny/shareだったら印をつける。
- arc4とsha1をつかう。
- 最初のデーターパケットをチェック: 最初のバケットサイズは固定っぽい: winnny 11B, share=158B
- WinnyだとRC4しかつかってない。11Bのうち3-6Bを復号鍵として7-11Bを復号して0x0100000061なったらWinny.
- Share: src portの2バイトからsha1で20バイトをえる。これが復号鍵。CFBモードで改変RC6でデコードしたときに最初の4バイトが0x02000000になってたらshare.
- ダメなところ
- nf_conntrackはポート番号が固定。
- helperをさがす
- spin lock: システムで1つしかないバッファを保護している。しかも中で重い判定処理をしている。CPUごとに分ければ解決するがネタのために残しておいた。
- nf_conntrackはポート番号が固定。
[2011-05-22 14:14]
- Q: 監視装置にDoSアタックくらったらどーなる?
- A: 実戦配備してないから。自分で作ったものは怖くて使えない。
[2011-05-22 14:16]
@akachochin「dalvikのGCをのぞいてみた」
[2011-05-22 14:17]
- mark&sweepが基本。copyもつかえる。
- gDvmから直接参照されているのがrootオブジェクト。
- GC_CONCURRENTのばあい
- GCスレッドの優先度を上げない
- ミューテータが動けるようにする
- dvmMalloc()から読む。
- mspace_calloc(): bionicのmallocはdlmallocアルゴリズム(たぶんlinux)
- freeで隣接するfree領域は併合される→フラグメンテーションをあるていど緩和できる。
- dvmHeapBitmapSetObjectBit
- どこがつかわれているか
- liveBits, markBitsが重要:ヒープを8Bにくぎっている。先頭だけにbitをたてる。サイズは別途。
- mspace_calloc(): bionicのmallocはdlmallocアルゴリズム(たぶんlinux)
- ルートのみに印をつけるフェーズ
- markBits:つかわれている領域の先頭にbitをたてる
- CardTableを0クリアする。マーク中に変更されるとdirtyになるようなもの。128B。
- 印のついたオブジェクトをたとるフェーズ
ー markBitsをたどっていく
- -- 参照アドレスが大きかったらmarkBitをたてる
- - 小さかったらmarkBitをたてずにstackというデータ構造にアドレスを保存する。(※理由不明)
- あとまわし(stacked)になったヒープをたどる
- スタックにつみながらスタックがからになるまでまわる。
- ここまではミューテータがうごいている
- 再度印をつけるフェーズ
- 先頭からたどると効率がわるい。
- cardTableでdirtyになっている領域をさがす→markBitsを調べる。
- 不要なヒープを解放する
- live & ~markを計算
[2011-05-22 14:49]
- Q:JavaObjectのフォーマット A:メンバの個数がわかるのでokだったとおもう。
[2011-05-22 14:51]
@kozossakai「アセンブラ大集合」
[2011-05-22 14:53]
- 全部自作。全部プロジェクトリーダ。
- gcc -S: リンク前なのでどういうアドレスがはいるかわからない
- objdump -d hoge.o: これもおなじ。
- objdump -d hoge: リンク後
- gcc -g + objdump -S
- -fomit-frame-pointer: フレームポインタをつかわなくなるのでアセンブラをよみやすくなる。
- -Oでは機種によってon/offがちがってくる。
- -O2では命令入れ替えがあるので読みにくくなる: -Oくらいがちょうどいい。
- 今回: -nostdlib -g -O + objdump -d -S
- ポイント
- 特殊レジスタは汎用レジスタに含まれるか?別名があるか?
- 代入の向き
- 関数呼び出しで保存されるレジスタと破壊されるレジスタはABIで決めあれているのに注意。
- 引数はレジスタわたしかスタックわたしか
- スタックの伸びる向き
- blr = branch link register
- li = load immediate
- jr ra = jump return address
- mips: gp = global pointer 毎回セットしなくてすむ。
- SH: 大きな値を入れるには命令の近くに値を埋め込んでloadしてくるコードがはきだされるのでキャッシュ効率が悪くなるのでは?
- ARMのおおきなあたい: mvn move not + sub + sub コンパイラすごい。
- ARM push はビットマップでレジスタを指定できる push lrしたのpop pcでもどれる?
- x86は関数のおしりに16バイトアラインのためのつめものがあるが、ちょうどの長さになるように命令を選んでいる。0をつめるだけではない。
[2011-05-22 15:34]
- -fomit-frame-pointerはデバッガで追えるなら-Oで有効になる。
- x86_64はけっこうABIちがう。
[2011-05-22 15:38]
16:15-16:45 Lightning Talk(GSoC) LT1-LT3 (8min発表/1min質疑)
@syuu1228 「Multiqueue BPF support and other BPF features」
[2011-05-22 15:41]
- multicore support on NIC
- 従来のNIC: the S100Kps problem (受信キュー/割り込みが1つだけ)
- 改善NIC: 各CPUに1:1で受信キュー/わりこみをもつ
- ハッシュ値をみてCPUにばらまく
- receive side scaling
- scalable network stack
- 複数CPUで並行してネットワークスタックを稼動出きる
- ロックでブロックしないように
- 順序をまもる
- BPFはスケールしない
- fdescをreadしているだけなので1スレッド
- RSSはかんがえられていない。分散したのに1つのバッファにまとめてしまう。
- multiqueue bpf
- アプリケーション側でCPUの数だけスレッドをたてる。
- NICごとにスレッドが対応。ioctlで対応付け。
- インターフェイスごとにロックする。
- Q:どのキューにパケットが入るか
[2011-05-22 15:53]
@laysakura 「Implement faster OpenMP Task for libgomp」
[2011-05-22 15:54]
- gccのopenMP task実装は極めて遅い
- #pragma と gcc -fopenmp オプション
- openMP taskとは?
- ptheadつくっておまかせでは性能がでない。
- CPUごとにタスクキューをおく
- #pragmae openmp task では親とおなじタスクキューにつっこまれる
- ひまなキューからタスクスティーリング
- Nanos, OpenUHでは性能がでている
- ロードバランスとローカリティが重要
[2011-05-22 16:02]
- GCCはタスクキューは1つしかないのでロックが競合を生んでいるようだ。
[2011-05-22 16:04]
@gokzy 「Implement the RPS/RFS in FreeBSD」
[2011-05-22 16:05]
- mono-queue nicで受信性能をスケールさせる
- linuxでの実装を移植。
- ithread:割り込みスレッド: link layer, driverの処理。
- ithreadの上のnetisr software threadを複数CPUに分散させる。
- 同一フローは同じnetisrにディスパッチしなければならない。
- {src,dst}x{addr,port}のハッシュ値から。
- 10数行で$2000いただき
- RFS: receive flow steering
- netisrとappを同じCPUにしたい。
- Appが移動したときにまだ未処理のnetisrに残っていたらそっちにディスパッチしなければいけない。
- データローカリティをかんがえてスケジューラに手を入れることは考えてない。
[2011-05-22 16:14]

16:45-17:15 休憩&関西からの発表中継 30分
- ライフゲームでXNOR
17:15-18:05 Lightning Talk(1) LT4-LT8 (8min発表/1min質疑)
@takeoka 「OS系低レイヤな人のためのtrapnsputerとか...」
- CSP:デッドロックがおこりにくい。
- Occam/Transputer
- Immos社(英) ST-Micro
- ErlangはST-Microがつくった、せいとうなながれ
- XmosがST-Microからスピンアウト
- Transputer: スケジューラはマイクロコード
- runp endp startp stopp insertqueue altwt timeslice jump
- committed choice
- セマフォよりもRPCのFIFOは静的に解析したらデッドロックがわかる。
- そんなこといってもそんなにたくさんアクティビティはないのでopenMPとかMPIになっちゃうのでは?
[2011-05-22 16:56]
@hyoshiok 「linux emulator by javascript」
- jslinux
- cp /dev/clipboard ... でできる バイナリはuuencode/uudecodeで。
- slのデモ
- クロックは中でカウントしているのでdateすると時刻の進みが遅い。
[2011-05-22 17:07]
@murachue「目grep入門」
[2011-05-22 17:11]
- ヘキサエディタ
- 最近のはビットマップ表示ができる
- 数値の範囲によって色わけ
- マジックナンバー
- パターン
[2011-05-22 17:19]
- おおざっぱな色づけで十分情報がみえてくる (とくに色はチューニングしてない)
- sha1とかAESは人間にはむつかしい
[2011-05-22 17:21]
@toyoshim「BeとHaikuとYUREX」
[2011-05-22 17:24]
- 1990ごろにBe,Inc設立
- 1996 power mac
- 1998 x86
- 2001 会社終了
- 2007 zeta終了
- BeOSのわるいところ: posix準拠が不完全なのでconfigure/makeがとおらない
- C++マングリングに依存していて最新のGCCがつかえない罠
- アドレス空間のつかいかたがwindows/linuxと逆
- fdescとsocketが別空間→redirectできない
- mmapがつかえない
- プレゼンはHaikuOSでやっている。
- デモ
[2011-05-22 17:35]
@uaa 「困ったときには(usb)ホストにきこう」
- Intel PCH
- RMH (rate matching hab) はチップセット内蔵なのでアナライザがつかえない!
- 1バイト要求なのに2バイト返ってきちゃう
- →8ポートなのでハブ自体のステータスビットとあわせると2バイトになっちゃう。ポート数にあわせて要求を出すようにて解決。
[2011-05-22 17:43]
18:05-19:45 Lightning Talk(2) LT9-18 (8min発表/1min質疑)
@siritori 「つくっておぼえる!仮想マシン〜妄想編〜」
- 自分OSつくる→失敗
- printfできるようになるまでが大変
- そもそもCPUの仕様がよくわかってない(1000ページもある)
- エミュレータを自作すればよくね? CPUも仕様も自分で決めたわけだし
- Erlang/OTPがあるので動いたままプログラムを変更できる
- R2000/3000likeなCPUを設計
- Erlangにはバイナリにパターンマッチできる機構がある
- Erlangでバイナリをそのままいじるのはわりとめんどう。
[2011-05-22 17:54]
@master_q「NetBSD manを翻訳しよう!」
[2011-05-22 17:56]
- linuxにはあるのにNetBSDに日本語情報がない。情弱にはつらい。
- 翻訳する手段にはまって翻訳がすすんでない。
- groff 21だとutf-8がつかえる。
- 本家に受け入れられるには
- オリジナルの差分管理
- 翻訳マンパワーの確保
- ブランチにも対応
- manをgettext化!
- .Sh とか .Pp できりとればいい!
- 翻訳: www.transifex.net
- msgmergeをつかえば..
[2011-05-22 18:04]
- Q:debianとかどっかでドキュメントをpo化するのはどっかにある。
- A:roffパーサほしい。
- Q:昔のFreeBSDにちょっとしたしくみがあった。
[2011-05-22 18:09]
@kei_os「Kinect わくわく on BeagleBoard !?」
[2011-05-22 18:10]
- androidフレームワークにkinectをポーティングしてbeagleboardをうごかす。
- androidのcamera APIをつかってkinectの映像/深度データをつかえるようにする。
- HALはカーネルとライブラリの間にある。
- フルセットもってきているので。あとでデバッグよろしく。
[2011-05-22 18:21]
- Q:アイソクロナスのはパラメータがびみょうらしい
[2011-05-22 18:23]
@masami256 「anaconda」
- カーネルをつくったらanacondaでインスーラをつくりましょう!
[2011-05-22 18:34]
@yojiro 「緊急地震速報HACK」
[2011-05-22 18:35]
- ここ10年くらい研究されて、ここ5年くらいでデプロイされて、最近つかわれている。
- (財)起床事業支援センターから専用線利用でIPパケットでくる。
- 誤報がおおいなとか、地震がくる前にshutdownしたりとか。
- 仕様書がインターネットにない。ハードコピー。更新も紙で。
ー すいそくしてみた
- - chkにヘルステェックを返す。
- チェックポイント応答にackをかえす。
- 45秒で7回も届いたり
- デコード電文
- コード電文パーサをかいてみた。
- 地名データの辞書もつくって400点弱(英語フランス語とか)
- Q: WNI last 10 secondがかんたん。簡単に高度利用のデータをとってくるのにつかえる。フォーマットもtcpdumpするとすぐわかるはず。
[2011-05-22 18:48]
@d_kami「My Emulator」
- x86エミュレータをかいた
- 自作OSを書いて検証
- ブラウザで動かせるようにしたい。Java→JavaScript変換。
- Q:どのくらい時間をつかったか?
- A:1年くらいかけた。
- Q:次はなんのエミュレータをつくるのか?
- A:まだいえない。そのうち公表する。
[2011-05-22 18:58]
@kumagi「辻ロックフリー」
- lock-free; クリティカルセクションをなくす
- CASでlock-free stackをつくるとheadポインタのとりあいになる。
- sleepを乱数で入れて
- pushとpopのマッチングがstackの目的
- 待ち時間はelimination arrayで待つ
- lock-free malloccはたいていstackをつかってる
- QA:sleepについてあつい議論が.... スループットのグラフは見掛けのスループットがあがっているように見えるだけかもしれない....
@hasegaw 「QEMUが地雷原なわけがない」
[2011-05-22 19:11]
- virtio: ホストとゲストのリングバッファ
- Xenは64bitゲストを32bitホストでうごかせる。がKVMは連続マッピングするのでできない。
[2011-05-22 19:19]
@shinh「Mach-O loader for Linux」
[2011-05-22 19:22]
- sedでELFをはくbrainfuckコンパイラをかいたり
- appleのgcc(mach-o)がうごく。
- グラフィカルなデモ: sl
- putsなんかはlinuxのをそもままつかえばABIもだいたいおなじだしOK.
- OpenCFLite (CF=core fundation)とかない
- Cocoaとかない Ccotronというプロジェクトある.. x86_64ではうごかない。
- openはモードがmacとlinuxで値がちがう。
- readdirのdirentは厄介:構造体のレイアウトが全然ちがう。
- fopen: *_unlockedをマクロでつかっていてこまる。
- Q:MAC OS用のlibcを移植したほうが簡単かも?
- A:このままサクッとすてちゃうかも。