Contenu connexe
Similaire à 20apr2012 kernelvm7-main
Similaire à 20apr2012 kernelvm7-main (20)
20apr2012 kernelvm7-main
- 2. 自己紹介
• Java原人
• Java原理主義者
• Javaのためならなんでも
– ハードウェア設計(回路、PCB等)
– ハードウェア実装(ホットプレートリフローを
提唱)
– サーバーサイド技術(REST/SOAP等)
– 組み込みJVM
• 無線、特にZigBeeが好き
– 日本ZigBeeユーザーグループ代表
- 3. (Java原人からみた)
Javaとは
• 小型の組み込み機器等に使われるプラット
フォーム
• センサーやクレジットカード、ICパスポート
に組み込まれることが多い
• 最近はパソコンでも動くようになったらしい
• JVMと呼ばれる海のなかで動く
– OSの上で動くことは稀
– OSがある時はLinuxが多い
• ARMと仲がいい
• お前にサンは救えない
- 7. 突付けられた現実
Java側
アプリ
TCP/IP
MAC
USB ドングル側
仕様の分からない
仕様の分からないドライバ
不親切なAPI
中途半端なMAC
PHY
- 9. EHCIとは
• USB2.0用のコントローラー仕様
• Intelが作った(んでしたっけ)
• HCIの一種
• ちゃんとレジスタの仕様が公開されてるo(^▽^)o
• 3年前のことなので大分忘れてます
- 13. OTG Controller
• Threadを一本用意してステートマシンを記述
– Stateが変わる(Parameter入力される)まで
wait
• GCからOTG割込がかかったら
– フラグをチェック
– 独自仕様なので、独断と偏見でOTG仕様の
Parameterに解釈
– パラメータ入力して先述のThreadにnotify
• OTG仕様に沿ってState変更
– やるべきことをやる
– State変更してまたwaitに戻る
- 14. OTG Controller
• b_idle時はid入力以外無視
– Device Controllerは実装してません
• 小技として・・・
– State変更時はyieldせずに即座に次のアクショ
ンをとっている
– Stateが変更されないとき(orサボって実装して
ないとき)はwaitする
– waitは1000msで一応外すようにしている
- 15. Host Controller
• OTGと同じくThread一本でステートマシン
• GCからの割込でUSBSTSをチェック
• 起動時はIdle状態
• OTGからのReset要求でポートリセット
– ポートリセット出来ないのでHC再起動
• PORTSCでポート検知、OTGにb_conn入力
• Asynchronous ListとPeriodic Frame Listを準
備
• AsyncListに初期QHを突っ込む
- 16. Asynchronous List
• QHとQTDを管理
• やってることは普通のEHCI
– Javaらしく
• QueueHead#setNextQH(QueueHead qh)
• QueueElement#fillPayload(byte[], int, int)
– newできないので自分でメモリ管理
• ImmortalHeapで予めたくさんとっておく
• #allocAlignedArrayとかできるので便利
• 分割して、それぞれ先頭のアドレスをPool
• Javaらしく
– QueueHead#newQueueHead
- 17. Periodic Frame List
• Isochronousは絶対にやりません
• FSTNもやりません
• QHのスケジュールがめんどくさい
– 2の冪でないといけない
• bIntervalが10だったら8とかになる
– HSの場合更に1/8ms単位でスケジューリングす
る
– 帯域オーバーしていないか常にチェックする
– SplitTransactionの場合はC-Maskも空きがある
か調べる
- 21. USBスタック
• JSR-80に(たぶん)準拠
– TCKは通してません(キリッ
• IBMの作ったRIを使用
• RIで足りないハード依存部を実装
– Device Enumeration等
• EHCIと合わせて概ね快調に動作
- 25. Ralink IO
• Ralink共通(?)のAPIセット
• たぶんUSB以外のインターフェースでも共通
– APIのインターフェース実装さえ変えれば他の
インターフェースにも対応?
• public interface RTIO
– public class USBIO implements RTIO
• USBの実装はControl転送を使用
– Vendor Request
• read32とかwrite8とか
– たぶんMCUのレジスタとお話してる
- 26. Ralinkの謎
• 起動時にファームウェアをまるごと転送
– 普通フラッシュに書かれてるのでは・・・
– 転送がよくコケる
• 膨大な量の定数
– 改造すれば普通に電波法やぶれそう
– メモリいじってパッチを当てている疑惑
• 怪しいノード管理
– wcid = associationId & 0xFF
• ControlFrameだけ実装されているぽい
– リアルタイム性の問題?
- 28. squilla-net
• Javaでプロトコルスタックを書くためのライ
ブラリを作った
• 各種フレームの生成
– 802.11、TCP/IP、ARP、802.3・・・
• 802.11関連多し
– ManagementFrame
– MLME
– Javaに欠けているWLAN用API
• Androidにはあるのに・・・(ボソ
• (↑大分参考にした)
• ひっそりオープンソースで公開
- 29. MLME
• 最低限のリクエストのみ実装
– SCAN
– JOIN
– AUTHENTICATE
– ASSOCIATE
• JOINがよくわからない
– 特にRalinkの場合、自動でやっている気がする
– JOINって名前が紛らわしい
- 32. IPv4
• 適当
• たぶんもっとまじめに実装しなきゃいけない
• フラグメント未対応
• 受診時チェックサム計算省略
– 少しでもパフォーマンスが上がると思った
の・・・
• 特にThreadなし
- 35. TCP
• 1人に聞いた!もう二度と実装したくないプロ
トコルスタック堂々の第一位
• なんでこんなプロトコルが30年以上まともに
動いているのかまったく不明
• 不可解な輻輳制御
• 理不尽な仕様書
• ひどい相性問題 TCPConnection
・・・
TCPConnection
TCPConnectionManager
- 36. TCP
• Slow-startもCongestion avoidanceもなし
• Fast Recoveryなんてムリムリ
• Fast Retransmitだけやった
• 輻輳制御なんてむりだお・・・
• TCPConnection毎にThread一本
– 頑張って再送まで含めて一本におさめた
• Connectionは頻繁に開閉するので専用の
ThreadPoolを作成
- 37. TCPConnection概要
InputStream OutputStream
BufferedPipe BufferedPipe
(Ring Buffer) (Ring Buffer)
TCPInput TCPOutput
ThreadPoolより割当
られた専用Thread
TCPConnection
- 39. なぜSingle-Threadか
• 当初はマルチスレッドにする予定だった
– タイムアウトタイマー用Thread
– 送信受信それぞれにThread一本づつ
• GCが使えないので管理が大変
– GCより高いプライオリティで動いている
• プログラムのミスを起こしやすい
– 同期を取るのが大変
• リソースを消費する
• tickが空回りしないように何もないときは
50ms程度sleepする
- 42. 残酷な現実
• やっぱりどうしてTCPはまともに動かない
– UDPはTCPに比べたらまとも
• 相性がひどい
– 同じWindowsでもパソコン変えただけで通信で
きたりできなかったり
– Mac相手だとやたら不安定だったり
• 簡単なSocket通信だと良いけど
– HELLOとか
• HTTPとか載せた瞬間に激不安定
- 44. わかったこと
• Linuxはすごい(いろんな意味で)
– EHCIのコードの雑さ
– ネット周りのスパゲティさ
– よくこれで動いてるな
• FreeBSDは読みやすい
– 特にネットスタック
• IEEEの仕様書は非常に親切で読みやすい
• IETFの仕様書は非常に不親切で読みにくい
- 48. 宣伝
• squilla
– http://code.google.com/p/squilla/
• Jazzkaffe
– http://code.google.com/p/jazzkaffe/
• Japan ZigBee User Group
– http://jzug.org/