カーネル/VM探検隊@関西 9回目 に参加しました。
会場
久しぶりに京都大学にきました。 単純に大阪から京都が遠いのと、バス停がわかりにくいのが大変でした。
バスを降りてから会場までは今まで通り裏手に回れば良いとわかっていれば簡単でした。
オープニング
- 会場諸注意
- 第 138 回関西 Debian 勉強会の宣伝
Linuxのプロセススケジューラの歴史
- Linuxのプロセススケジューラの歴史
- 対象バージョンは一番最初 (0.01) から最新 (4.18) まで全部
- ~v2.4.x : 最初のスケジューラ
- v2.6.0~v2.6.22 O(1)スケジューラ
- v2.6.23~ CFS
- 0.01 のスケジューラの解説
- v1.0 : Preemption の導入, Nice 値の扱いがまともになる
- v2.0
- ランキューのデータ構造が (配列から) リストに
- SMP 対応
- リアルタイムポリシーの追加 (sched_setscheduler の man も参照)
- v2.2 と v2.4 はたいして変化なし
- v2.6.0 O(1)スケジューラ
- コア部分のアルゴリズム総とっかえ
- キューは LCPU ごとに 80 本 (nice 値ごとに active, inactive)
- 対話型タスクの優先動作
- LCPU ごとのランキュー
- ロードバランサ
- ロードバランサと NUMA
- CPU affinity (全 CPU で 1 つずつ動かしたいハートビート用タスクなどで使う)
- カーネルレベルスレッド
- 豆知識 : 魔改造カーネルの話
- V2.6.12: cpuset
- O(1)スケジューラの諸問題
- V2.6.20~22 の開発中あたり: RSDL vs CFS
- V2.6.23: CFS の勝利
- Completely Fair Scheduler (CFS)
- レイテンシターゲットによるスケジューリング : 簡略化して図で説明
- プラガブルなスケジューラ
- 細かいタイムスライス粒度
- V2.6.24: fiar group scheduling
- cpu cgroup
- usecase: ユーザ間で CPU 資源を均等分割
- V2.6.24: cpuset cgroup
- リアルタイムタスクが止まらない問題: コアが 1 つしかないとシステムがハング
- V2.6.25: Realtime group scheduling
- 重要なカーネルスレッドが動けない問題: CPU hotplug の stop_machine
- V2.6.37: Stop scheduing class
- V2.6.38: autogroup: 通称ミラクルパッチ
- Fiar group scheduling の課題: 上限設定ができない
- V3.2: CFS bandwidth controller
- V3.14: Deadline スケジューラ
-
V4.18: マイナーチェンジ中心で機能的にはあまり変わっていないはず
- 質疑応答
- メインフレームから昔からあったリソース制御はコミュニティに嫌われてなかなか入らなかったが Google が頑張って入った
- CFS でもランキューは LCPU ごと、寿命が短いものをロードバランスしにくくするのは研究はいろいろあるが今はやっていない
- 大きな変更はなさそうという話
- スケジューラが入れ替えることができるのは今も楽にできる
- I/O スケジューラ版は? → がんばって次回?
極めて速いストレージとの付き合い方
- 極めて速いストレージとの付き合い方 - Speaker Deck
- https://github.com/Fadis/spdk_sample
- シーケンシャルリードの速度の変化
- 高スループットかつ高レイテンシ
- 同期 I/O の計測
- AIO での計測
- 常に大きな I/O 要求をできるとは限らない
- 小さいブロックの I/O で相対的に大きくなるオーバーヘッドを減らしたい ≒ - 小さいパケットの I/O で相対的に大きくなるオーバーヘッドを減らしたい
- DPDK → SPDK
- SPDK の説明
- SPDK での計測
- flush がちゃんとできていなかったのを修正して再計測
- さらに計測
- blobstore
- blobfs
- Controller Memory Buffer
質疑応答は xfs や btrfs の性能の話とか。
USBC000ってなんだ?
- FreeBSD の人
- 最近マシンを買い換えた
devinfo -rv
acpidump
- USB Type-C
- USB PD
- Alternate mode
- USBC000 は USB と Alternate mode の USB 以外を区別するためのもの
- UCSI
- UCSI の実装の話
- ポートの正体
- ドッキングステーション
seccamp2018でセルフホストCコンパイラをつくった
- seccamp2018でセルフホストCコンパイラをつくった - Speaker Deck
- constexpr で NN を書いた
- 「Cコンパイラを自作してみよう!」に参加した
- 事前にある程度やっていた
- Day 0 でセルフホストできた
- aqcc
- 作り方: やるだけ
- AST をシュッとする
- 構造体定義がキモい
- Day 2 やることがない
- スタックマシンからレジスタマシンに
- レジスタが足りなければ assert で落ちる
- gcc でのコンパイルは通るが aqcc で生成した aqcc のデバッグが大変
- 最適化
- seccamp の最後はバグったというオチだった
- 直したので今回の発表にオチがないのはよくない
- アセンブラも作った
- mov 命令の罠 (SIB)
- リンカも作った
- 簡単な libc も作った
- malloc は free しないものにした
- コンパイル + アセンブル + リンク するとメモリが辛い
- 言霊.in
- メモリリーク → 再起動すれば良い (PHP の人)
休憩
Xbyakの紹介とその周辺の話題
- Xbyakの紹介とその周辺
- Xbyak (かいびゃっく) : C++ 用の x86/x64 専用 JIT アセンブラ
- AVX-512 までサポート
- 2018/9 現在 Intel の一番長い名前の命令は 17 文字
- インラインアセンブラではなく、純粋な C++ コードを書いて使う
- 多倍長加算の例
- LLVM の JIT と比較
- LLVM は意外と各種アーキテクチャに縛られる (ランタイムエラーになる)
- 1024 bit の加算の例
- 利用例
- PS2 エミュレータ PCSX2
- mruby の JIT by miura1729 さん
- サイボウズ・ラボユース生による JIT
- 3DS エミュレータ
- Intel MKL-DNN : 機械学習・深層学習ライブラリ
- iWAPT 2018 : 自動パフォーマンスチューニングワークショップの Intel の招待講演
- 行列演算の端数処理
- キャッシュサイズを意識
- LIBXSMM : Intel による小さい行列計算専用 JIT ライブラリ (Xbyak は使っていない)
- Xbyak の実装
- いろいろなトラブル
- jnl が Intel コンパイラのグローバル関数にあって衝突
- and が C++ では予約語 : VC では iso646.h を include しなければ使えて gcc/clang では
-fno-operator-names
-
#if not +0
というトリック - Linux だとたくさん new できない
- N=32700
/proc/sys/vm/max_map_count
-
posix_memalign
の代わりにmmap
を使うと制限にひっかからない (理由は謎) XBYAK_USE_MMAP_ALLOCATOR
- 古典的なラベル、柔軟なラベル
- プロファイラ
- バグ
-
Intel SDE の仕様に悩む
- 質疑応答
- AMD でも AVX の命令を使わないようにするなどの対応をしていれば動く
- カーネルモジュールでも頑張れば使える
小指を負傷した人のためのカーネルハック
- https://speakerdeck.com/orumin/vm-kansai-number-9
- orumin さん
- 石灰沈着性関節炎
- 小指がもしもどうにかったときにするべきカーネルハック
- 小指を使わないタイピング
- SandS
- X のドライバーのパッチはあるが Wayland (+ GNOME) で使えない
- やることはカーネルハック
- 時間がないので推測でパッチ
- うまくいかなかった
- 結局薬指を使っている
- 状態を持つコードは大変
-
libinput にパッチがあると良い
- 質疑応答
- SKK には Sticky Shift がある
WSL でも FUSE したかった
- Kernel / VM 関西9 - WSL FUSE: WSLでもFUSEしたかった
- WSL とは : Microsoft が最近出した過激なやつ
- FUSE とは : 例 SSHFS, CloudFusion
- WSL FUSE 概略
- 実装パート
- FUSE の Windows 実装 : WinFSP, Dokan / Dokany
- 今回は WinFSP を使う
- cgo が使いやすい
- 完成しませんでした
- WinFSP のサンプルの Passthrough をデモ
-
Windows から WSL のファイルシステムが見えないので Passthrough だけでも便利
- 質疑応答
- WSL のファイルが見えないというのは、見えなくはないが読めても書き込むと壊れるという話
休憩
マイコン向けのただのリンカを書いた話
- 発表資料
- ルネサス RX マイコン向けのリンカを書いてみました
- ライセンスが足りない → 無償評価版、使用権を巡る争い
- ライセンスが足りないならリンカを書けばいいじゃない
- ただ(無料)のリンカ
- 簡単なものから作る
- 1 ファイルから
- 謎のリロケーション
- リンカを Ruby で書いてみた
- バイト型がないので低レイヤに向かない
- 構造体をラップする拡張ライブラリを作って対応
質疑応答は特になし
ハードウェアハッキング入門 -バスレベルでのリバースエンジニアリング-
- レイヤー別 Attack surface
- ハードウェアレイヤーでの Attack surface とは?
- サイドチャネル攻撃、バス上の信号盗聴、 Glitching Attack
- ここでは「バス上の信号盗聴」をとりあげる
- シリアルポート
- Samsung Smart TV : デフォルトではシリアルコンソールなどは無効だが赤外線で有効化できる
- 配信はしているが、資料は公開しない
- Samsung Calaxy S5/6/7
- 物理的なポートは確認できない
- S-Boot 内の Odin サーバーモードを解析
- Odin クライアントはリークしたものが存在する
- Odin サーバーにはターミナルっぽいものがある
- 物理的なアクセス手段が不明
- リークしたデバッッグ用ジグ (Samsung Anyway ジグ) が ebay で売られている
- MUIC (マルチプレクサ) が実装されている
- USB Micro B コネクタにある抵抗をかけると UART モードになる
- Microsoft Xbox
- デバッグインターフェースは存在しない
- Xbox ブートプロセス
- 第 1 ステージブートローダーの解析は Flash ROM を取り外して ROM リーダーを使う
- ピンセット型の半田ごてで外せる
- 第 2 ステージブートローダーの解析
- Southbridge と Northbridgge 間のバスを盗聴する
- まとめ
- デバッグインターフェースが実装されている場合
- シリアルポートが陽に存在する
- 隠しモードがある
- ない場合
- チップを取り外し
- ランタイムにバスを盗聴する
- デバッグインターフェースが実装されている場合
- 質疑応答
- 最近の ROM はマスクされていて読めない
- MUIC の抵抗のモードは 20~30 種類ぐらいあるらしい
- Anyway ジグに説明書などがついていたかどうかは不明
時間が余ったので質疑応答など
- eBPF とか systemtap とかのまとまった資料はない?
- なさそう。陳腐化してしまうので自分でやるしかない。
- Kernel/VM 関西を引き継いでくれる人を募集
- Kernel/VM/探検隊@北陸 part 4 - connpass
Togetter まとめなど
Disqus Comments