[4181361] | 1 | 豊岡拓 |
---|
| 2 | |
---|
| 3 | ftrace snapshotを作った、Kernel 3.9で利用可能になる |
---|
| 4 | |
---|
| 5 | トレースとは |
---|
| 6 | この発表においては、プログラムの実行を理解する上で有益なデータをバッファ等に記録すること |
---|
| 7 | 用途 |
---|
| 8 | デバッグ |
---|
| 9 | 障害解析 |
---|
| 10 | 常時トレースを動かしておき、システムが停止した時にダンプを用いて理由を解析する |
---|
| 11 | 性能解析 |
---|
| 12 | どこが時間を食っているのか |
---|
| 13 | ボトルネック解析 |
---|
| 14 | ftrace |
---|
| 15 | カーネルに組み込まれているトレース機構 |
---|
| 16 | 元々はRTツリーのFunction tracerから始まった (なのでftrace) |
---|
| 17 | 現在では様々なトレース機能が統合されている |
---|
| 18 | Events |
---|
| 19 | Latency |
---|
| 20 | 最大の割り込み禁止期間を知りたい |
---|
| 21 | Stack |
---|
| 22 | Block, mmio |
---|
| 23 | Dynamic events |
---|
| 24 | 好きなところにbreakpointを設置 |
---|
| 25 | Trace Events |
---|
| 26 | あらかじめ埋め込まれたトレースポイントを踏んだ時にイベントを記録 |
---|
| 27 | 現在のLinux Kernelでは500以上が設定されている |
---|
| 28 | syscallを含めるともっと |
---|
| 29 | Kernelの中のTrace bufferに記録される |
---|
| 30 | 記録されるデータ |
---|
| 31 | PID |
---|
| 32 | CPUID |
---|
| 33 | タイムスタンプ |
---|
| 34 | イベント名 |
---|
| 35 | イベント毎の引数 |
---|
| 36 | Kernelsharkというツールで可視化出来る |
---|
| 37 | Fedoraには標準である |
---|
| 38 | Function Tracer |
---|
| 39 | カーネル内の全ての関数呼び出し・リターンを記録出来る |
---|
| 40 | コールグラフ、処理時間が分かる |
---|
| 41 | Irqsoff Tracer |
---|
| 42 | 最大の割り込み禁止区間を検出 |
---|
| 43 | 「最大で8013us発生したよ」 |
---|
| 44 | RTOSだとかなり大きい遅延 |
---|
| 45 | ftraceの全体像 |
---|
| 46 | hook mechanisms |
---|
| 47 | mcount |
---|
| 48 | tracepoint |
---|
| 49 | kprobes |
---|
| 50 | (uprobes) |
---|
| 51 | plugin tracers |
---|
| 52 | function |
---|
| 53 | irqsoff |
---|
| 54 | wakeup |
---|
| 55 | stack trace |
---|
| 56 | trace event |
---|
| 57 | common components |
---|
| 58 | debugfs I/F |
---|
| 59 | ring buffer |
---|
| 60 | debugfs経由で操作 |
---|
| 61 | /procの様なもの |
---|
| 62 | 疑似ファイルをecho, catする |
---|
| 63 | trace-cmd |
---|
| 64 | /sys/kernel/debug/tracing/ 以下にファイルが出来る |
---|
| 65 | current_tracer |
---|
| 66 | どのpluginを使うか指定する |
---|
| 67 | トレースバッファ |
---|
| 68 | ロックレスリングバッファ |
---|
| 69 | 記録を読み出しを並行して行える |
---|
| 70 | # cat trace するだけでバッファを読み出せる |
---|
| 71 | テキスト形式 |
---|
| 72 | バッファ内のデータは消費されない |
---|
| 73 | 書き込み可能、かつO_TRUNCでopenするとクリア |
---|
| 74 | # echo > trace |
---|
| 75 | trace_pipe |
---|
| 76 | traceに似ている |
---|
| 77 | バッファ内のデータを読んだ際に消費する |
---|
| 78 | trace_pipe_raw |
---|
| 79 | バイナリ形式で生の情報を出力する |
---|
| 80 | splice(2)でゼロコピー転送が可能 |
---|
| 81 | cpu毎のI/Fしかない |
---|
| 82 | 一度に全部のCPUを読み込むことは出来ない |
---|
| 83 | options/ |
---|
| 84 | options/overwrite |
---|
| 85 | バッファが満杯になった時に上書きするか、記録をやめるか |
---|
| 86 | 1 -> 古いイベントを捨てる (デフォルト) |
---|
| 87 | 0 -> 記録停止 |
---|
| 88 | events/ |
---|
| 89 | イベントの有効・無効を制御 |
---|
| 90 | filter |
---|
| 91 | 特定の条件を満たすイベントだけを記録出来る |
---|
| 92 | trace_marker |
---|
| 93 | ユーザ空間からトレースバッファにイベントを記録する |
---|
| 94 | write(2)で好きな文字列を書き込むだけで記録出来る |
---|
| 95 | アプリケーションの動作チェックなどに有用 |
---|
| 96 | 最近入った・入る予定の機能 |
---|
| 97 | Kprobes event(2.6.33~) |
---|
| 98 | 動いているカーネルに動的に好きな場所にイベントを埋め込める |
---|
| 99 | カーネルの改造不要 |
---|
| 100 | Uprobes event (2.6.35~) |
---|
| 101 | Kprobesのユーザ空間番 |
---|
| 102 | アプリケーションの改造不要 |
---|
| 103 | Ojbdumpなどでアドレスを持ってくる必要がある |
---|
| 104 | Snapshot(3.9~) |
---|
| 105 | トレースを止めずに、ある瞬間のバッファのスナップショットを取る機能 |
---|
| 106 | 予備のトレースバッファを用意しておいて、好きなタイミングで切り替える |
---|
| 107 | # echo 1 > snapshot |
---|
| 108 | これだけでスナップショットが取られる |
---|
| 109 | この際に予備のバッファも割り当てられる |
---|
| 110 | バッファの割り当て時間が気になる場合は、あらかじめ1を書いてバッファを確保しておくと良い |
---|
| 111 | Multi-buffer(3.10~?) |
---|
| 112 | トレースバッファを用途別に複数個使い分ける機能 |
---|
| 113 | 今までは一つのグローバルバッファしかなかった(せいぜいCPU毎) |
---|
| 114 | バッファの個数はmkdir/rmdirで動的に変更可能 |
---|
| 115 | # cd instances/; mkdir buf_1 |
---|
| 116 | 今のところ、Trace Eventsのみ利用可能 |
---|
| 117 | Function-trigger |
---|
| 118 | 特定の関数が呼ばれた時にアクションを起こす |
---|
| 119 | トーレス全体のOn/Off |
---|
| 120 | 特定のイベントが呼ばれたらトレースイベントをOn/Off |
---|
| 121 | スナップショットを取る |
---|
| 122 | スタックトレースを取る |
---|
| 123 | # echo 'vfs_read:snapshot:1' > set_ftrace_filter |
---|
| 124 | trace_clock |
---|
| 125 | タイムスタンプの種類を変更出来る |
---|
| 126 | 基本的にはTSCベース |
---|
| 127 | local -> CPU間で同期を取らない |
---|
| 128 | global -> ロックを取って同期させる |
---|
| 129 | counter -> 順番だけを見たい時 |
---|
| 130 | x86-tsc (3.8~) -> 生のTSC |
---|
| 131 | local/globalはTSCをマイクロ秒などに変更している |
---|
| 132 | uptime -> jiffersだけなので軽い |
---|
| 133 | perf -> perfと同じタイムスタンプをつける |
---|
| 134 | Q/A |
---|
| 135 | オーバーヘッドはどれくらいか |
---|
| 136 | どれくらいのイベントをOnにするかによる |
---|
| 137 | 取りたいイベントをあらかじめOnにして、その後負荷の具合を見ながら調整する |
---|
| 138 | 記録する際にロックを取るなどによりメモリ帯域を食ってしまうことはないか |
---|
| 139 | 基本的にCPU間でロックを取ることはない(ロックレス) |
---|
[5ab4cdf] | 140 | |
---|
| 141 | |
---|
| 142 | @Fantom_JAC |
---|
| 143 | いまさら聞けないZigBee |
---|
| 144 | ZigBeeは日本では名前しか知られてない |
---|
| 145 | というか、まともな日本語の本も出ていない |
---|
| 146 | |
---|
| 147 | ZigBeeの特徴 |
---|
| 148 | 日本で流行っていない |
---|
| 149 | 802.15.4と混同される |
---|
| 150 | BluetoothやWiFiに押され気味 |
---|
| 151 | 年会費高い |
---|
| 152 | etc... |
---|
| 153 | ZigBeeの歴史 |
---|
| 154 | ZigBee 2004とZigBee 2006は互換性がない |
---|
| 155 | 今年 ZigBee IPが出た |
---|
| 156 | ZigBee三大要素 |
---|
| 157 | IEEEで決まっているのはPHYとMACで決まっている (802シリーズ) |
---|
| 158 | それより上はアライアンスで決めた |
---|
| 159 | NWK |
---|
| 160 | この層がZigBeeとしてもっともよく知られた層 |
---|
| 161 | APL |
---|
| 162 | この層が全然理解されていない (後方互換性が無いのはここ) |
---|
| 163 | APS, ZDO, ZCL |
---|
| 164 | 802.15.4とは |
---|
| 165 | IEEEが策定したPAN標準 |
---|
| 166 | 802.15.1 -> Bluetooth |
---|
| 167 | 802.15ワーキンググループ (WPAN) |
---|
| 168 | 別名Low Rate WPAN |
---|
| 169 | 速度を犠牲にして消費電力を減らす |
---|
| 170 | 2.4GHz |
---|
| 171 | NWK Layer |
---|
| 172 | メッシュを実現している層 |
---|
| 173 | ルーティング・ネットワークの管理 |
---|
| 174 | どのようなネットワークトポロジーになっているかはあまり重要ではない |
---|
| 175 | 世の中に出回っているのはほとんどZigBee Pro |
---|
| 176 | 毎回ルーティングを探す |
---|
| 177 | NLDE |
---|
| 178 | ふつうのData Entity |
---|
| 179 | フレーム作ってセキュリティ掛けたり |
---|
| 180 | NLME |
---|
| 181 | ネットワークの開始・参加・離脱 |
---|
| 182 | PAN IDの管理 |
---|
| 183 | ルート探索 |
---|
| 184 | ルーティング |
---|
| 185 | ZigBee Network |
---|
| 186 | Coordinator |
---|
| 187 | Router |
---|
| 188 | EndDevice -> 電気を食わない |
---|
| 189 | Coordinator |
---|
| 190 | ネットワークに常に一台しか居ない |
---|
| 191 | 802.11におけるAPのようなもの |
---|
| 192 | 常にOn -> スリープ出来ない |
---|
| 193 | 基本的にPCだったりして、ゲートウェイ的働きをする |
---|
| 194 | Router |
---|
| 195 | ネットワークを作成出来ない他はCoordinatorと同じ |
---|
| 196 | EndDevice |
---|
| 197 | ネットワークを作成出来ない |
---|
| 198 | 子ノードを持つことが出来ない |
---|
| 199 | ルーティング出来ない |
---|
| 200 | 通常はスリープ状態 |
---|
| 201 | 普段はメッセージを受信することが出来ない |
---|
| 202 | Coordinator/RouterからEndDeviceにメッセージを投げると、直接届いているように見える |
---|
| 203 | 実はメッセージは親を経由する |
---|
| 204 | EndDeviceはスリープから復帰した時、自分で取りに行く |
---|
| 205 | メールチェックのような仕組み |
---|
| 206 | 宛先のEndDeviceが取りに来なかったら、無慈悲に削除される |
---|
| 207 | デフォルトタイムアウトは7680ms |
---|
| 208 | 何とかしてすぐに送りたい |
---|
| 209 | たぶんWakeupボタンみたいなのがあるはず |
---|
| 210 | Wakeupボタンを押すと… |
---|
| 211 | DoSのように何度も読みに行くだけ |
---|
| 212 | FAQ |
---|
| 213 | 消費電力について |
---|
| 214 | Coordinator/Routerは常にRXはON |
---|
| 215 | 電池がどんどん減る |
---|
| 216 | 極力スリープ状態を長くすることでしか解決出来ない |
---|
| 217 | Wakeupを5分毎くらいにすると、半年くらいは電池が持つようになる |
---|
| 218 | PANIDが2つ(?) |
---|
| 219 | 16-bit PANID |
---|
| 220 | MACアドレスで使われるネットワーク識別ID |
---|
| 221 | アドレスが二つ? |
---|
| 222 | IEEE adressとNetwork address |
---|
| 223 | IEEE -> いわゆるMAC adress (64bit) |
---|
| 224 | Network adress IPスタックにおけるIPアドレスのようなもの |
---|
| 225 | APL Layer |
---|
| 226 | アプリケーション層 |
---|
| 227 | ZigBee最大の特徴 |
---|
| 228 | APS、Application Framework (ZDO/ZCL)の二つに分かれている |
---|
| 229 | アプリケーションフレームワークがプロトコルレベルで決まっている |
---|
| 230 | ZigBeeは単なる「通信方式の一つ」ではない |
---|
| 231 | ビジネスに直結する仕様が策定されている |
---|
| 232 | アライアンスの存在意義 |
---|
| 233 | モダンな設計 |
---|
| 234 | オブジェクト指向の概念がふんだんに取り入れられている |
---|
| 235 | APS Layer |
---|
| 236 | 上位のフレームワーク層と直接やりとりする層 |
---|
| 237 | Binding, Group Management, etc... |
---|
| 238 | Endpoint毎にユーザのアプリケーションが格納される |
---|
| 239 | Binding |
---|
| 240 | あるApplication Objectと別のそれをリンクする |
---|
| 241 | 単一方向 |
---|
| 242 | 多重バインディング |
---|
| 243 | Binding Table |
---|
| 244 | Group Addressing |
---|
| 245 | 複数のApplication Objectに対して一括送信したい |
---|
| 246 | 基本的にブロードキャスト、受信側が責任を持ってフィルタする |
---|
| 247 | Group Table |
---|
| 248 | APS ACK |
---|
| 249 | 信頼性を高める |
---|
| 250 | ACKタイムアウト時に再送 |
---|
| 251 | Fragmentation |
---|
| 252 | 名の通りデータのフラグメント化 |
---|
| 253 | 実装されていないこともある |
---|
| 254 | ウィンドウサイズがあったりと、TCPに似ている |
---|
| 255 | Security |
---|
| 256 | これだけで仕様書別になっているので、今回は省略 |
---|
| 257 | Application Framework |
---|
| 258 | Cluster |
---|
| 259 | 「機能」を指し示すような概念 |
---|
| 260 | Application Objectが外部にどのような機能を提供するか |
---|
| 261 | Application Objectには必ずClusterが一つ以上ある |
---|
| 262 | ZCLにおいては「クラス」に近い概念 |
---|
| 263 | Profile |
---|
| 264 | Clusterの集まりを定義 |
---|
| 265 | クラスに対するパッケージに近い概念 |
---|
| 266 | APSメッセージはCluster IDとProfile IDを指定する必要がある |
---|
| 267 | ZigBee Device Object |
---|
| 268 | USBのEndpoint0と似ている |
---|
| 269 | Application Objectの実装 |
---|
| 270 | ZDOとZDPは違う概念 |
---|
| 271 | ユーザが作成するApplication Objectは通常APSDE以外触れることが出来ない |
---|
| 272 | サンドボックスの様な仕組み |
---|
| 273 | 別途ZDOを経由する |
---|
| 274 | ZigBee Cluster Library |
---|
| 275 | ユーザが作成するApplication Objectの実質的な仕様、枠組み |
---|
| 276 | 必ずサーバとクライアントが対になって通信しなければいけない |
---|
| 277 | Profile固有のClusterと共通のClusterが存在する |
---|
| 278 | ZigBee IP |
---|
| 279 | つまらないので省略 |
---|
| 280 | Pure Java ZigBee Application Framework: Bekko (LGPL) |
---|
| 281 | アライアンス入会とは? |
---|
| 282 | ZigBeeを名乗るプロダクトを開発する権利 |
---|
| 283 | HAやSE等PAPプロダクトを開発する権利 |
---|
| 284 | ただし、非営利目的であれば入会不要 |
---|
| 285 | 営利目的であっても既に認定を受けたプロダクトを利用するだけなら入会不要 |
---|
| 286 | XBeeは入会不要 |
---|
| 287 | Q/A |
---|
| 288 | 有名なプロダクト例 |
---|
| 289 | 日本で市販はされていない |
---|
[04eb6d7] | 290 | BluetoothやWiFiとは違い、B2Bが目的なので、コンシューマ向けではない |
---|
[5ab4cdf] | 291 | アメリカにおいては、Control4Cが、「一戸建て建てる時にZigBee組み込みませんか」みたいなキャンペーンはしている |
---|
| 292 | 蛍光管をLEDに代える際に、ZigBee組込みで、配線無しでOn/Off出来る製品とか |
---|
| 293 | 日本ではMAKEというイベントに行けば見れるかも |
---|
| 294 | |
---|
| 295 | |
---|
[d3973ef] | 296 | @fusioniojp |
---|
| 297 | FUSION-IO関連の楽しいお話 |
---|
| 298 | IOMEMORY SDKとNVMインターフェース |
---|
| 299 | Non Volatile Memory |
---|
| 300 | NANDフラッシュメモリとDMAコントローラを一体にしたもの |
---|
| 301 | |
---|
| 302 | 現行 |
---|
| 303 | NANDとメインメモリの間にI/Fのコントローラが挟まっていて、遅い |
---|
| 304 | SASコントローラなど |
---|
| 305 | これから (カットスルーアーキテクチャ) |
---|
| 306 | FPGAで実装されているデータバスコントローラを使う |
---|
| 307 | メインメモリに直接コピーされる |
---|
| 308 | 512byte -> 10usで書ける |
---|
| 309 | HPCではデータをHDD上に置かない |
---|
| 310 | SSDが出てきた時、「NANDはメモリなんだから、メモリのようにI/O出来るようにすべきだ」 |
---|
| 311 | 不揮発メモリであれば、BlockI/Oでは実現出来ないような操作が可能 |
---|
| 312 | BlockI/Oは回転型メディアにあわせて設計されている |
---|
| 313 | テープ |
---|
| 314 | open/read/write/rewind |
---|
| 315 | ディスク |
---|
| 316 | open/read/write/seek |
---|
| 317 | SSD |
---|
| 318 | ディスクと同じ様にあえてしている |
---|
| 319 | Trimとかは一応あるが…… |
---|
| 320 | ioMemory NVM |
---|
| 321 | 不揮発メモリの特性を生かした追加機能 |
---|
| 322 | 通常のライト+アトミックライト・条件付きライト |
---|
| 323 | ジャーナル要らなくね? |
---|
| 324 | 通常のライト+TTLライト(のちに自動消去) |
---|
| 325 | このデータは自動的に消滅する |
---|
| 326 | mmap+クラッシュセーフ・バージョニング |
---|
| 327 | 先ほどのftraceの様にどんどんログを書き込む |
---|
| 328 | SSDの登場により、フラッシュメモリを使ったアプリケーションが実現した |
---|
| 329 | フラッシュメモリをメモリとして利用すると、ソフトウェア開発のあり方が変化する |
---|
| 330 | 現行 |
---|
| 331 | アプリケーション -> BlockI/O、ネットワークファイル |
---|
| 332 | これから |
---|
| 333 | アトミックI/O |
---|
| 334 | トランザクション |
---|
| 335 | ユーザ定義のオブジェクトによりトランザクション |
---|
| 336 | Key-Valueトランザクション |
---|
| 337 | memcached |
---|
| 338 | 将来 |
---|
| 339 | 高速なロギング |
---|
| 340 | チェックポイントメモリ |
---|
| 341 | メモリトランザクション |
---|
| 342 | CPUからメモリに書き込むように、フラッシュメモリに書き込める |
---|
| 343 | 100万IOPSのカードは既に実現している |
---|
| 344 | CPUのコンテキストスイッチの方が問題になってくる |
---|
| 345 | -> mmaped I/Oすれば良いのでは |
---|
| 346 | 64byte/1thread -> 960万回 |
---|
| 347 | スパースアドレス空間 |
---|
| 348 | デバイスI/Fのオープン化と、OSS |
---|
| 349 | directFS |
---|
| 350 | NVM APIライブラリ |
---|
| 351 | Atomic writeはSCSI標準化に向けてプロポーザルを出した |
---|
| 352 | ハードウェア側で書き込みを保証出来るので、アプリケーションとしては単に「書き込む」だけで良い |
---|
| 353 | MySQLのダブルバッファーのようなことは必要なくなる |
---|
| 354 | 書き込み量が減るので、製品の寿命も長くなって良い |
---|
| 355 | 書き込みの粒度を512byteから小さくすれば、一回の書き込みに掛かる時間は短くなる |
---|
| 356 | directFS |
---|
| 357 | swap -> Extended memory |
---|
| 358 | |
---|
| 359 | Q/A |
---|
| 360 | ウェアレベリングなどはどこで行われているか |
---|
| 361 | CPU側で行っている |
---|
| 362 | SSDのような小さなデバイス上に実装されているマイコンで行われるのを待ってCPUが |
---|
| 363 | ブロッキングされるより、CPUで行った方が結果として早かったりする |
---|
[de9540b] | 364 | |
---|
| 365 | @ntddk |
---|
| 366 | がんばれEMET |
---|
| 367 | ntddk 由来はWindowsでドライバを書く際にincludeするヘッダから |
---|
| 368 | |
---|
| 369 | EMETとは |
---|
| 370 | Windows上で脆弱性を突く攻撃を防ぐツール |
---|
| 371 | VS2003 |
---|
| 372 | /GSオプションの導入 |
---|
| 373 | security cookieの検証 |
---|
| 374 | 上書きされていないか |
---|
| 375 | SEH Overwriting |
---|
| 376 | SafeSEH |
---|
| 377 | ビルド時に、正規の例外ハンドラの一覧を作りそれ以外は実行出来ないようにする |
---|
| 378 | サードパーティのDLLなどは行われていないことが多い |
---|
| 379 | SEHOP |
---|
| 380 | VistaSP1~ |
---|
| 381 | HardwareDEP |
---|
| 382 | NX/XD bit |
---|
| 383 | 実行不可能フラグ |
---|
| 384 | 処理を乗っ取ったが実行は出来ない |
---|
| 385 | VirtualAllocによりメモリ属性を変更される |
---|
| 386 | DEPを無効化するAPIなど |
---|
| 387 | Return-orientied Programming |
---|
| 388 | JITコンパイラによって、実行中に悪意のあるコードを生成 |
---|
| 389 | ASLR |
---|
| 390 | アドレス空間のランダム化 |
---|
| 391 | HeapSprayによる攻撃 |
---|
| 392 | とりあえずHeapを埋めてしまう |
---|
| 393 | いたちごっこの様相を示している |
---|
| 394 | そこでEMET |
---|
| 395 | XPの様な骨董品でも、脆弱性防御機能が有効になっていないバイナリでも防げる |
---|
| 396 | EMETでも防げない攻撃もある |
---|
| 397 | EMETを導入しないと当然使えないので、ビルド時にEMETの機能が付加されて欲しい |
---|
| 398 | オレオレEMETの実装 |
---|
| 399 | shimというフレームワーク |
---|
| 400 | Windowsの後方互換性を保つための仕組み |
---|
| 401 | Windows版Wineの様なイメージ |
---|
| 402 | EMET.dllにはGetHookAPIs, NotifyShimsというAPIがエクスポートされている |
---|
| 403 | DLLインジェクションとは異なる |
---|
| 404 | ダメだったよ |
---|
| 405 | Shimに頼らずにオレオレEMET |
---|
| 406 | 一般的な方法でDLLインジェクション |
---|
| 407 | オレオレDEP |
---|
| 408 | 実装は簡単 |
---|
| 409 | Win32APIでGetProcessDEPPolicyで無理矢理有効に出来る |
---|
| 410 | オレオレEAF |
---|
| 411 | EMET独自の実装 |
---|
| 412 | 悪意のあるコードはfs:[30h]を読み取り、Win32APIのアドレスを得ようとする |
---|
| 413 | Export Address Tableへのアクセスをフィルタ |
---|
| 414 | ハードウェアブレークポイント |
---|
| 415 | きみだけの最強EMETを作ろう |
---|
| 416 | カーネルにはパッチを防ぐ機構がx64には別に存在している |
---|
| 417 | |
---|
| 418 | 林佳寛 |
---|
| 419 | QEMUとkvmとvt-x |
---|
| 420 | QEMUとは…、kvmとは…、vt-xとは… |
---|
| 421 | 英語でよく分からない! |
---|
| 422 | qemu-kvmはホストOSから見ると、一つのプロセスである |
---|
| 423 | ゲストOSはCPUをベアマシンと変わらず使う |
---|
| 424 | センシティブ命令に関しては、vt-xとホストOSが頑張るので、ゲストOSを改造する必要がない |
---|
| 425 | qemu-kvmはカーネルのkvmもデューるを用いてvt-xを使う |
---|
| 426 | 目的 |
---|
| 427 | qemu, kvm, vt-xでどのように処理が流れているか知る |
---|
| 428 | Fedora 15 x86_64 2.6.42 |
---|
| 429 | virtio-blkに何かをwriteした時にどのようなことが起きるのか |
---|
| 430 | 1. システムコール |
---|
| 431 | ゲストOS上で、プロセスがファイルを開いて書き込む |
---|
| 432 | 2. センシティブ命令 |
---|
| 433 | ファイルシステムを通じて、BlockI/O |
---|
| 434 | ブロックデバイスはvirtio-blk |
---|
| 435 | virtioはゲストとホスト間でデータを共有するためのqueueに要求を入れる |
---|
| 436 | virtqueue_kick |
---|
| 437 | vp_notify |
---|
| 438 | io_write16 |
---|
| 439 | -> PORT/IO |
---|
| 440 | |
---|
| 441 | vt-x |
---|
| 442 | センシティブ命令をトラップするための仕組みがvt-x |
---|
| 443 | VMExitし、kvmへ処理を移す |
---|
| 444 | センシティブ命令 |
---|
| 445 | ゲストOSが発行したPORT/IOをホストOSでそのまま実行してしまうと、そのアドレスは |
---|
| 446 | ホストでは違うデバイス、あるいは何もないかもしれない |
---|
| 447 | -> VMExitしてエミュレーションする |
---|
| 448 | 3. VMExit |
---|
| 449 | センシティブ命令を契機として、VMEnterした命令の次に処理が戻ってくる |
---|
| 450 | vmx_vpcu_run |
---|
| 451 | vmx_handle_exitに戻ってくる |
---|
| 452 | VMExitの要因になったハンドラを呼び出す |
---|
| 453 | どういう理由でExitしたかを格納した構造体がホストOSに渡される |
---|
| 454 | 今回は EXIT_REASON_IO_INSTRUCTION -> handle_io |
---|
| 455 | handle_io |
---|
| 456 | 引数に指定されたポート版を処理するための関数が設定されているかを確認する |
---|
| 457 | が、virtio-blk用の関数は設定されていない |
---|
| 458 | 関数が設定されていて、処理がうまくいけば1、そうでなければ0 |
---|
| 459 | -> 今回は0 |
---|
| 460 | __vpu_runには返値0で戻ってくる |
---|
| 461 | __vpu_runからも0でreturnする -> kvm_arch_vcpu_ioctl_run |
---|
| 462 | kvm_arch_vcpu_ioctl_run: /dev/kvmへのioctlを処理する |
---|
| 463 | 4. ioctlのreturn |
---|
| 464 | /dev/kvmに対するioctlがreturnした、ということになる |
---|
| 465 | qemu-kvmはioctlがreturnしてきた理由を確認する |
---|
| 466 | kvm_handle_io |
---|
| 467 | ポート番号からデバイスを検索 |
---|
| 468 | 今回はvirtio-blkのデバイスが見つかる |
---|
| 469 | デバイス毎にエミュレーション |
---|
| 470 | qemu-kvm自体は普通のプロセスなので、ライブラリ関数を呼び出す -> 最終的にはホストOSのシステムコールへ |
---|
| 471 | |
---|
| 472 | 8. VMEnter |
---|
| 473 | ioctlされたkvmはVM Enterする |
---|
| 474 | 9. センシティブ命令のエミュレーション完了 |
---|
| 475 | ようやく2. のIOが終わったことになる |
---|
| 476 | つまり… |
---|
| 477 | qemu-kvm |
---|
| 478 | vt-x/kvmの力を借りて、なるべくエミュレーションしないように改造されたQEMU |
---|
| 479 | kvm |
---|
| 480 | カーネルモジュール |
---|
| 481 | 最近の仮想化潮流 |
---|
| 482 | qemu-kvmの仕事を減らす方向 |
---|
| 483 | メモリのコピーやringの切替にCPUをたくさん使う |
---|
| 484 | VMX NON-ROOT/VMX ROOTを超えるペナルティが大きい |
---|
| 485 | ハードウェアやkvmで処理を行ってコンテキストスイッチを減らしたい |
---|
| 486 | vt-d, vhost, 割り込み仮想化、など |
---|
| 487 | |
---|
[aa2cedc] | 488 | @katsyoshi |
---|
| 489 | ZFSでNASやってはまったこと |
---|
| 490 | FreeBSD+ZFSでファイルサーバ |
---|
| 491 | ZFS root/ ZFS + Samba |
---|
| 492 | ZFSの内部構造とかはしない |
---|
| 493 | ZFSとは |
---|
| 494 | Sunが開発した次世代ファイルシステム |
---|
| 495 | 128bitアドレッシング |
---|
| 496 | RAID5, RAID6, Triple Parity |
---|
| 497 | 重複排除 |
---|
| 498 | 暗号化 |
---|
| 499 | とりあえず動くOS |
---|
| 500 | Solaris |
---|
| 501 | FreeBSD 7.0- |
---|
| 502 | Linux Native/FUSE |
---|
| 503 | ZFS Root壊れたサーバ |
---|
| 504 | Memory 512MB * 4 -> 足りない |
---|
| 505 | 運用中のサーバ |
---|
| 506 | 2GB * 4 -> 原因不明で停止したことがある |
---|
| 507 | メモリ足りない場合は |
---|
| 508 | loader.confに設定してメモリを節約する |
---|
| 509 | それでも落ちる時は落ちる |
---|
| 510 | 16GB/32GBくらいは欲しい |
---|
| 511 | wiki.freebsd.org/RootOnZFS |
---|
| 512 | 構成する全てのdiskにルートパーティションを入れておくと、後で楽 |
---|
| 513 | ディスクが壊れたら |
---|
| 514 | zfs replace old-disk new-disk |
---|
| 515 | 後は寝て待つ |
---|
| 516 | |
---|
| 517 | @d_kami |
---|
| 518 | 自作x86エミュレータの終焉 |
---|
| 519 | 何が終わるのか |
---|
| 520 | x86エミュレータ |
---|
| 521 | 何が学べたのか |
---|
| 522 | x86の命令セット |
---|
| 523 | 世の中にはOSがたくさんある |
---|
| 524 | 命令セットを覚えると? |
---|
| 525 | ソースコードを紛失した、仕方ないので続きはバイナリで作ろう |
---|
| 526 | バイナリエディタならあるぞ |
---|
| 527 | ソースコードは残したくない、バイナリで書くしかない |
---|
| 528 | つまり |
---|
| 529 | 役に立たない |
---|
| 530 | どこではまるのか |
---|
| 531 | 同じような命令を作っていて、ちょっとした違いにはまる |
---|
| 532 | 命令長 |
---|
| 533 | 条件分岐に失敗して無限ループ |
---|
| 534 | Intelのマニュアルに騙される |
---|
| 535 | 3年間で10000行くらい |
---|
| 536 | バグが多すぎる |
---|
| 537 | 勘違い、Intelの罠 |
---|
| 538 | もうやめます |
---|
| 539 | それじゃあいつやめるのか、今でしょ |
---|
| 540 | いきなりx86はやめるべき |
---|
| 541 | 作る前に調べるべき |
---|
| 542 | |
---|
| 543 | @boronology |
---|
| 544 | CD/DVDのエラー計測 |
---|
| 545 | DVD -> プリンタブルの糊でメディア同士がくっついてしまう |
---|
| 546 | 今回扱う内容 |
---|
| 547 | 読み込みエラーの計測 |
---|
| 548 | ハードウェア的なエラーはまた今度 |
---|
| 549 | SANYOチップのPlextorドライブがBEST |
---|
| 550 | 前提 |
---|
| 551 | ECCというブロックの連続 |
---|
| 552 | 182*208の2次元配列 |
---|
| 553 | 20万行くらいエラーが出るのは普通 |
---|
| 554 | NGだと1600万くらいになったりする |
---|
| 555 | 色素を新規開発したのに、Media IDを使い回したせいで、おかしなことになった |
---|
| 556 | 経年劣化 |
---|
| 557 | あまり変わらない(5年) |
---|
| 558 | DVD焼く時に埃が付いていると、その部分だけエラーの山になるが、特に問題はない |
---|
| 559 | 規格的には許容される |
---|
| 560 | 多くのドライブは、書き込み中に速度を落として様子をみたりしている |
---|
| 561 | DVDなら三菱化学メディアの8倍速 |
---|
| 562 | CDなら太陽誘電 |
---|
| 563 | そんなことよりバックアップ多重化したほうがいい |
---|
| 564 | プレス版のDVD-ROMでも10万くらいエラーは出る |
---|
| 565 | TDKの超硬は5年保存でも4万くらいだった |
---|
| 566 | |
---|
| 567 | @sirrow |
---|
| 568 | EMC Style 2013 の解説 |
---|
| 569 | EMCという会社 |
---|
| 570 | EMC Style 2013 |
---|
| 571 | EMCによるGangnam Styleのパロディ |
---|
| 572 | 2013/01に公開 |
---|
| 573 | で、何が言いたいの? |
---|
| 574 | Now everybody scale out down the row! |
---|
| 575 | 2013 -> 来年は違う? |
---|
| 576 | スケールアウトが大切だ、というのは今だけ? |
---|
| 577 | |
---|
| 578 | @Talos208 |
---|
| 579 | フォントとカーネル/VMのあやしい関係 |
---|
| 580 | フォントって何? |
---|
| 581 | 文字をデバイスに表示する時に表示するデータ |
---|
| 582 | 文字コードとグリフの対応表 |
---|
| 583 | 一対一対応とは限らない |
---|
| 584 | 縦書きと横書き |
---|
| 585 | 合字 |
---|
| 586 | グリフ |
---|
| 587 | 図形としての文字 |
---|
| 588 | 本来アプリケーション層のもののはず |
---|
| 589 | CFFのフォントに脆弱性があってJailbreakとか |
---|
| 590 | CFFの「命令コード」 |
---|
| 591 | OpenTypeフォント |
---|
| 592 | AdobeとMicrosoftが策定したフォント形式 |
---|
| 593 | 基本的にはTrueType、内部テーブルの種類が追加されている |
---|
| 594 | CFFテーブル |
---|
| 595 | CFFフォントが丸ごと入っている |
---|
| 596 | 他のテーブルと情報が重複している |
---|
| 597 | PDFにCFFグリフのOpenTypeを埋め込むと、CFFの部分だけ使われたりする |
---|
| 598 | CFFフォントの構造 |
---|
| 599 | CharaStringINDEX |
---|
| 600 | .notdefCharString, A CharString |
---|
| 601 | CharString命令表 |
---|
| 602 | callsubr |
---|
| 603 | return |
---|
| 604 | escape |
---|
| 605 | dup |
---|
| 606 | each index rollといった命令 |
---|
| 607 | まっとうな2スタックのスタックマシン |
---|
| 608 | もうVMだよね |
---|
| 609 | VM相当とはいえかなり制限されている |
---|
| 610 | メモリアクセス、IO操作などは出来ない |
---|
| 611 | Windows OSごと落ちるフォントを作ろうとしたが、詳細を忘れてしまって、次の機会 |
---|
| 612 | |
---|
| 613 | @hktechno |
---|
| 614 | 自作コンピューターでなんかする(仮) |
---|
| 615 | 発表をFPGAボードで行います! |
---|
| 616 | ハードウェア担当は@cpu_labs |
---|
| 617 | 自作コンピュータ != 自作PC |
---|
| 618 | 命令セット |
---|
| 619 | MMU |
---|
| 620 | IOコントローラ |
---|
| 621 | 全部作る |
---|
| 622 | mist32アーキテクチャ |
---|
| 623 | アウトオブオーダー実行 |
---|
| 624 | 独自の命令セット |
---|
| 625 | ハードウェアとソフトウェアの強調動作 |
---|
| 626 | MIST1032ISA / MIST1032SA |
---|
| 627 | ソフトウェア |
---|
| 628 | gccはやめた方が良い -> llvm |
---|
| 629 | binutilsは仕方ない |
---|
| 630 | mrubyを載せたい |
---|
| 631 | UART(シリアル)ついてる |
---|
| 632 | とりあえずコンパイル出来れば動くらしい |
---|
| 633 | これから |
---|
| 634 | Out of Orderコアを動かす |
---|
| 635 | MMUや割り込み・IO周りのテスト |
---|
| 636 | ベンチマークを取る |
---|
| 637 | SDカード対応 |
---|
| 638 | DMA対応 |
---|
| 639 | |
---|
| 640 | @mhiramat |
---|
| 641 | Intel SDMのopcode mapから作るディスアセンブラ in kernel |
---|
| 642 | kprobes/ftrace/perftoolsとかのメンテナの一人 |
---|
| 643 | # cat debug/x86/disassembly |
---|
| 644 | 現在走っているカーネルのメモリを指定した関数名でダンプして、逆アセンブルする |
---|
| 645 | 背景 |
---|
| 646 | kprobesのデバッグ -> 自己書換コードの様子が知りたい |
---|
| 647 | 簡単にメモリ上のバイナリをデコードしたい |
---|
| 648 | 既存のものはどれもオレオレフォーマットで出力するものばかり |
---|
| 649 | SDMのAppendix A |
---|
| 650 | Opcode Map |
---|
| 651 | Intel Officialなinstructionのエンコード表記 |
---|
| 652 | -> arch/x86/lib/x86-opcode-map.txt |
---|
| 653 | 実装したもの |
---|
| 654 | x86命令デコーダ |
---|
| 655 | x64, AVXにも対応 |
---|
| 656 | Intel形式と、AT&T形式の両対応 |
---|
| 657 | debugfs, kdb, toolsの三つの使い方が可能 |
---|
| 658 | Kconfig |
---|
| 659 | CONFIG_X86_DISASSEMBLE |
---|
| 660 | Oopsでcodeの欄が既にdisassemble済で出てくる |
---|
| 661 | |
---|
| 662 | @naota344 |
---|
| 663 | 野良ビルドからみたGentoo |
---|
| 664 | build process |
---|
| 665 | unpack |
---|
| 666 | patch |
---|
| 667 | ./configure |
---|
| 668 | make |
---|
| 669 | (make test) |
---|
| 670 | make install |
---|
| 671 | unpack |
---|
| 672 | 特に注目するようなところはない |
---|
| 673 | Gentooにはunpackというコマンドが用意されている |
---|
| 674 | ./configure |
---|
| 675 | econfを打つだけで、様々なオプションをつけてconfigureしてくれる |
---|
| 676 | --disable-dependency-tracking |
---|
| 677 | automakeの機能であるコードの依存チェックを無効化する |
---|
| 678 | --disable-silent-rules |
---|
| 679 | CC fooとかLD fooとかに省略されてしまうのを無効化 |
---|
| 680 | デバッグに不便なので |
---|
| 681 | patch |
---|
| 682 | /etc/portage/patches で管理される |
---|
| 683 | パッチの紛失を防げる |
---|
| 684 | makeの落とし穴 |
---|
| 685 | Makefileがおかしい |
---|
| 686 | "cd hoge; make"とか書いてある |
---|
| 687 | CFLAGS, LDFLAGSが反映されない |
---|
| 688 | gccを直接読んでいる |
---|
| 689 | リンクがおかしい |
---|
| 690 | こっそり出ているエラー |
---|
| 691 | command not found |
---|
| 692 | file does not exist |
---|
| 693 | make対策 |
---|
| 694 | ビルドログの監視 |
---|
| 695 | frecord-gcc-switches |
---|
| 696 | .GCC.command.line section |
---|
| 697 | CFLAGSなどのチェック |
---|
| 698 | --hash-style=gnu |
---|
| 699 | ld.goldを使う |
---|
| 700 | build log監視 |
---|
| 701 | command not found以外にも |
---|
| 702 | gccの警告 |
---|
| 703 | strict aliasing |
---|
| 704 | int X; float *Y; |
---|
| 705 | X = 1; |
---|
| 706 | *Y = 3.14; |
---|
| 707 | printf("%ld\n", X); |
---|
| 708 | underlinking 1/2 |
---|
| 709 | --as-neededをつけるとリンクが通らなくなる |
---|
| 710 | underlinking 2/2 |
---|
| 711 | make installの落とし穴 |
---|
| 712 | rootで実行される |
---|
| 713 | 突然 rm -r /usrされたり |
---|
| 714 | インストールしたバイナリがやばいかも |
---|
| 715 | RUNPATH, TEXTREL, EXECSTACKが変な値になっている |
---|
| 716 | DT_NEEDED |
---|
| 717 | SONAMEが抜けてる |
---|
| 718 | world writableにsetuid |
---|
| 719 | debug情報が付いたまま |
---|
| 720 | 他にも |
---|
| 721 | 容量がとても必要があるもの |
---|
| 722 | /usrとか/varとかがあふれる |
---|
| 723 | メモリ不足 |
---|
| 724 | gccのバージョン・カーネルの設定チェック |
---|
| 725 | ブラウザでGentoo体験 |
---|
| 726 | bit.ly/9VG7xz |
---|
| 727 | |
---|
| 728 | @iorivur |
---|
| 729 | DragonFly BSD's Hypervisor vkernel |
---|
| 730 | What's DragonFly BSD |
---|
| 731 | HAMMER file system |
---|
| 732 | だけじゃない! |
---|
| 733 | vkernelのはなし |
---|
| 734 | カーネルをユーザランドで動かす機構 |
---|
| 735 | カーネルのデバッグが主眼 |
---|
| 736 | make pkg-create |
---|
| 737 | git gc --agressiveが後ろで走って壊れる |
---|
| 738 | vkernel専用のカーネルをmakeする必要がある |
---|
| 739 | make worldなどなど |
---|
| 740 | ホストからは一つのプロセスに見える |
---|
| 741 | 通常のプロセスと同じように、gdbでアタッチしてbreakpointとか設置出来る |
---|
| 742 | valgrindが動くと嬉しい |
---|
| 743 | |
---|
| 744 | @syuu1228 |
---|
| 745 | MMIO ON VT-X |
---|
| 746 | エミュレーションの種類 |
---|
| 747 | ゲストOSの全命令をソフトウェアエミュレーション -> 遅い |
---|
| 748 | vt-x以前: 実行されると困る命令だけを動的に置き換えて、ネイティブに実行 |
---|
| 749 | Binary Translation |
---|
| 750 | vt-x後: CPUをゲストモードへ切り替え、ゲストOSのプログラムをネイティブに実行 |
---|
| 751 | 置き換える必要がない |
---|
| 752 | 本来は、ハイパーバイザーはCPU命令の置き換えはしないはずなのに……? |
---|
| 753 | 命令エミュレーションをしている部分がある! |
---|
| 754 | VT-xなハイパーバイザーのライフサイクル |
---|
| 755 | ホストOSのカーネルからゲストモードへ (VMEntry) |
---|
| 756 | ハードウェアへのアクセスなど、ハイパーバイザーの介入が必要になったら、ゲストモードを停止し、ホストOSへ戻る (VMExit) |
---|
| 757 | 終わったら再開する |
---|
| 758 | IO命令によるVMExit |
---|
| 759 | Exit Qualification |
---|
| 760 | アクセスサイズ |
---|
| 761 | In/Outの方向 |
---|
| 762 | String命令か? |
---|
| 763 | REP prefix |
---|
| 764 | etc... |
---|
| 765 | Exit Qualificationの情報に用いてIO命令をエミュレーション出来る |
---|
| 766 | Exit Qualificationを見ればどうすればいいか分かる |
---|
| 767 | MMIOによるVMExit |
---|
| 768 | MMIOは通常のメモリアクセスと同じ命令を用いる |
---|
| 769 | IO命令と違って命令で判別してVMExit出来ない |
---|
| 770 | アクセスしたアドレスで判別可能 |
---|
| 771 | MMIO領域に相当するページにアクセスした時にVMExit(EPT violation)が起きるようにEPTを設定 |
---|
| 772 | read/writeともに拒否 |
---|
| 773 | MMIOでのVMExit時に得られる情報 |
---|
| 774 | どの種類のアクセス権違反か |
---|
| 775 | ページに設定された権限 |
---|
| 776 | ゲストOSがアクセスしたアドレス(論理・物理) |
---|
| 777 | アクセスがread/writeどちらかは分かる |
---|
| 778 | 書き込み元・読み込み先の情報(アドレス・レジスタ)と、アクセス幅が分からない |
---|
| 779 | どんな命令が実行されたのか分からない |
---|
| 780 | メモリアクセスする命令はx86だとかなりある |
---|
| 781 | 情報が足りない状態でMMIOするには |
---|
| 782 | ゲストEIPの指すアドレスの命令をデコードして、opcode/oprandを取得 |
---|
| 783 | オペコード通りの動作をエミュレーション |
---|
| 784 | これって命令エミュレーション! |
---|
| 785 | なんでこうなっているのか |
---|
| 786 | x86にはメモリアクセスする命令がとても多い |
---|
| 787 | そもそもEPT violationはページのアクセス権限エラーを知らせるVMExitであって、MMIOを知らせるものではない |
---|
| 788 | 頻繁にMMIOされるとパフォーマンス的に不利 |
---|
| 789 | Local APIC仮想化支援 |
---|
| 790 | Local APICは割り込み周りで頻繁にアクセスされるが、MMIOを使っており準仮想化にもなじみづらいデバイス |
---|
| 791 | この領域のMMIOだけはVT-xが特別扱いされている |
---|
| 792 | レジスタ・条件によってはVMExit自体省略 |
---|
| 793 | Coaleseed MMIO |
---|
| 794 | MMIO領域には、読み書きによる副作用が無く、単純なメモリの読み書きに置き換えられる部分が存在 |
---|
| 795 | VGAボードのピクセルデータの領域とか |
---|
| 796 | VMExitしたらカーネル内で命令エミュレーションを実行、メモリ読み書き |
---|
| 797 | ユーザランドでのデバイスエミュレーションを省略 |
---|
| 798 | e1000のパフォーマンスが9.7%向上 |
---|
| 799 | まとめ |
---|
| 800 | ハードウェア仮想化支援機構であっても、全部やってくれるわけではない |
---|
| 801 | 出来ない部分はソフトウェアでやらないといけない |
---|
| 802 | |
---|
| 803 | Q/A |
---|
| 804 | Exit Qualificationで得られるアドレスは実は正確ではない |
---|
| 805 | 例えば、ページフォルトの例では、境界をまたいでアクセスした際に、 |
---|
| 806 | 実際にアクセスを開始したアドレスではなくて、禁止されているアドレスのみが |
---|
| 807 | 渡されるので、それを使ってエミュレーションするのは危険 |
---|
| 808 | |
---|
| 809 | @yogata |
---|
| 810 | TELNETの話 |
---|
| 811 | telnet |
---|
| 812 | ネットワークエンジニアの基本コマンド |
---|
| 813 | 「telnetも知らないんですかー?」 |
---|
| 814 | TELNETは暗号化出来る(結論) |
---|
| 815 | TELNETとは? |
---|
| 816 | RFC854 |
---|
| 817 | Network Virtual Terminalを作ること |
---|
| 818 | コードセットは7bit USASCII, 標準制御機構 |
---|
| 819 | セッション確立時にオプション交換をする |
---|
| 820 | ターミナルとプロセスで表示内容を同期させること |
---|
| 821 | TELNETネゴシエーション |
---|
| 822 | もしかしてネゴシエーションで暗号化出来るのでは? |
---|
| 823 | RFC2946で定義されている |
---|
| 824 | TELNETコマンドコード 38 |
---|
| 825 | TELNETのキャプチャを見る |
---|
| 826 | 結論 |
---|
| 827 | TELNETでも暗号化出来る |
---|
| 828 | telnetはソースルーティングするパケットを作れる |
---|