More Related Content
PPTX
x86-64/Linuxに独自メモリ空間を勝手増設 PDF
0章 Linuxカーネルを読む前に最低限知っておくべきこと PDF
PDF
BHyVe: The BSD Hypervisor ODP
PDF
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜 PPTX
x86-64/Linuxに独自メモリ空間を勝手増設 ODP
What's hot
PDF
【学習メモ#7th】12ステップで作る組込みOS自作入門 PDF
本当にわかる Spectre と Meltdown PDF
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門 PDF
PDF
PDF
2011.09.18 v7から始めるunix まとめ PDF
【学習メモ#3rd】12ステップで作る組込みOS自作入門 PDF
PDF
【学習メモ#1st】12ステップで作る組込みOS自作入門 PDF
Basic of virtual memory of Linux PDF
PDF
PDF
PDF
PDF
エンジニアなら知っておきたい「仮想マシン」のしくみ (BPStudy38) PPTX
HDFSネームノードのHAについて #hcj13w PDF
KEY
PDF
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会 Viewers also liked
KEY
軽快なPlan 9 Update - Illumos KVM上陸 - PDF
PPTX
ODP
KEY
KEY
Similar to 20apr2012 kernelvm7-main
PPT
PDF
PDF
High Performance Networking with DPDK & Multi/Many Core PDF
PDF
PPTX
PDF
『どうする?どうやる? データセンター間ネット ワーク』 - 802.1aq(SPB)/TRILL@JANOG29 KEY
20120519 #qpstudy インターフェース入門 PDF
PDF
PEZY-SC programming overview PDF
【学習メモ#11th】12ステップで作る組込みOS自作入門 PDF
L2 over L3 ecnaspsulations PDF
PDF
PDF
PDF
PDF
PDF
PDF
動的ネットワークパス構築と連携したエッジオーバレイ帯域制御 PDF
「Tiのソケットで待ってる」Titanium Nagoya Chatroom Vol.2 20apr2012 kernelvm7-main
- 1.
- 2.
自己紹介
• Java原人
• Java原理主義者
•Javaのためならなんでも
– ハードウェア設計(回路、PCB等)
– ハードウェア実装(ホットプレートリフローを
提唱)
– サーバーサイド技術(REST/SOAP等)
– 組み込みJVM
• 無線、特にZigBeeが好き
– 日本ZigBeeユーザーグループ代表
- 3.
(Java原人からみた)
Javaとは
• 小型の組み込み機器等に使われるプラット
フォーム
• センサーやクレジットカード、ICパスポート
に組み込まれることが多い
• 最近はパソコンでも動くようになったらしい
• JVMと呼ばれる海のなかで動く
– OSの上で動くことは稀
– OSがある時はLinuxが多い
• ARMと仲がいい
• お前にサンは救えない
- 4.
- 5.
- 6.
- 7.
突付けられた現実
Java側
アプリ
TCP/IP
MAC
USB ドングル側
仕様の分からない
仕様の分からないドライバ
不親切なAPI
中途半端なMAC
PHY
- 8.
- 9.
EHCIとは
• USB2.0用のコントローラー仕様
• Intelが作った(んでしたっけ)
• HCIの一種
• ちゃんとレジスタの仕様が公開されてるo(^▽^)o
• 3年前のことなので大分忘れてます
- 10.
- 11.
- 12.
- 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も空きがある
か調べる
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 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だけ実装されているぽい
– リアルタイム性の問題?
- 27.
- 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って名前が紛らわしい
- 30.
- 31.
- 32.
IPv4
• 適当
• たぶんもっとまじめに実装しなきゃいけない
• フラグメント未対応
• 受診時チェックサム計算省略
– 少しでもパフォーマンスが上がると思った
の・・・
• 特にThreadなし
- 33.
- 34.
- 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
- 38.
- 39.
なぜSingle-Threadか
• 当初はマルチスレッドにする予定だった
– タイムアウトタイマー用Thread
– 送信受信それぞれにThread一本づつ
• GCが使えないので管理が大変
– GCより高いプライオリティで動いている
• プログラムのミスを起こしやすい
– 同期を取るのが大変
• リソースを消費する
• tickが空回りしないように何もないときは
50ms程度sleepする
- 40.
- 41.
- 42.
残酷な現実
• やっぱりどうしてTCPはまともに動かない
– UDPはTCPに比べたらまとも
• 相性がひどい
– 同じWindowsでもパソコン変えただけで通信で
きたりできなかったり
– Mac相手だとやたら不安定だったり
• 簡単なSocket通信だと良いけど
– HELLOとか
• HTTPとか載せた瞬間に激不安定
- 43.
- 44.
わかったこと
• Linuxはすごい(いろんな意味で)
– EHCIのコードの雑さ
– ネット周りのスパゲティさ
– よくこれで動いてるな
• FreeBSDは読みやすい
– 特にネットスタック
• IEEEの仕様書は非常に親切で読みやすい
• IETFの仕様書は非常に不親切で読みにくい
- 45.
- 46.
- 47.
- 48.
宣伝
• squilla
– http://code.google.com/p/squilla/
• Jazzkaffe
– http://code.google.com/p/jazzkaffe/
• Japan ZigBee User Group
– http://jzug.org/