オープニング / nekomatu(主催者)
FPGA Subsystem in Linux Kernel / Masanori Ogino
- FPGAのくみあわせ: CPUとバス接続、FPGA上にCPU(ソフトコア)、パッケージ(SoC)
- drivers/fpga 12000行
- fpga manager: プログラムの抽象化
- fpga bridge: プログラム中の安全をまもる仕組み
- fgpa regeon: フレームワーク
- Q: partial reconfigはできるか?
- A: partialはむつかしい→ライブでソースコード探検→デバイスによるが管理できそう
- tokei: https://t.co/bAmHhEuR6k
- Q: fpgaデバイスはcpuからどうみえる?
- A: デバイスドライバしだい。pciのレジスタだったりgpuっぽくみえたり。
- Q: fpga subsystemはどうつかわれている?
- A: pciのようにprobeするのではなくてdevice treeの機能の提供とか、reconfigの統一(それまではベンダー固有のツールが必要)(でもまだメジャーなdistributionには入ってない)
- u-dma-bufとudmabufはデータのながれる向きが逆
- 低位合成: レジスタ、配線、ロジックを書くとFPGAの回路が出てくる
- 高位合成: circt.llvm.org: PyTorch→ MLIR→systemc, systemverilogが出てくる
Ethernetのお話 / Hiroki Mori (yamori813)
- XEROXが原型をつくってIEEEが承認したかたち
- MAC,PHY,Trans,RJ45で構成される
- etherヘッダは14バイトなのでIPヘッダが4バイトバウンダリにならないのでこまる。
- switch接続の形: スイッチのPHYを本体のMACでつなぐものや、スイッチのMACと本体のMACをつなぐものも。
- FreeBSDにはetherswtichがある。
「QEMUのバグを見つけてパッチを送った話」 / だいみょーじん
- 自作OSをQEMUでうごかしていたらGDBをアタッチしてレジスタをみると値がおかしい逆ハイゼンバグに遭遇。
- gdbにgdbをアタッチして調査
- gパケットがqemuからgdbに送られてくる。
- gパケットの構想はXMLで記述されていてqemu→gdbに送られている。
- XMLの記述が矛盾していた。
- gパケットの仕様ではレジスタの相対指定が正しいがqemuは絶対位置指定で送っていた。
休憩 10分
「低レイヤーから始めるGUI」 / Fadis
- GPUの2つの機能: メモリの内容をディスプレイに送るののと計算。
- RRM/KMS: 複数のレンダーノードが計算できるが表示はプライマリノードしかできない(Xサーバはプライマリノード)。
- アプリが1つならプライマリノードで描画できる。
- サーフェスは2画面以上用意されている(ダブルバッファリング用)
- UIの基本形: 長方形、画像(長方形にテクスチャをはっただけ)、文字、記号(ベクトル)
- インスタンシング: こまかい要求をなげるとGPUがひまCPUはいそがしくなるので、メモリにまとめてかいとく。
- GPUでベクタ画像をレンダリングするのはなかなかむつかしい。
- でも極端なサイズで描画されることはすくないので三角形に事前に分割してしまう。
- 生成したglTF(json)の確認にはblenderがつかえる。
- フォントはトポロジがちがうのでインスタンシングはつかえない→インダイレクトドローをつかう。
- HarfBuzz: 文字列からグリフの置き場所をおしえてくれるライブラリ.
- ICU: UBIDI: 文字の向き(LTR, RTL)を判断するライブラリ
- ICU: UBRK: 折り返しできる文字列を返してくれる。
- ubidi→ubrk→harfbuzz→折り返し処理
- 文字: 1em, offset(カーソルから描画する位置の指定), advance(カーソルの移動量)
- 入力はlibinput
- xkbcommon: キーボードレイヤを指定するとキーの位置から文字がわかる。
- 日本語はdbusでfcitx(ファイテックス)で。
- 未実装: 半透明、縦書き、アンチエイリアス、OpenType、sdbus(LGPL)、RaspberryPiでクラッシュ
- 2ヶ月でつくった。
- VulkanはGPUを直たたきできるAPI。
- VulkanはOpenGLの下半分という認識。OpenGLは古いので上半分はエミュレーションレイヤになっている。
- VulkanはむつかしいAPIなので簡単につかうにはOpenGLが今でも便利。
- アラビア文字ではコードポイントの置き換えが必要になってくる。どこかで処理が必要...
「Zigはうっかりコーディングミスを絶対に許さない!」 / @tetsu_koba (小林哲之)
- Zig言語: 静的型付きのコンパイル言語。C言語に今までの知見で再構成したもの。
- 5分でざっと理解するZig言語: https://zenn.dev/tetsu_koba/articles/2da58bd66586aa
- うっかりミスをふせぐ: 自動チェック & アノテーション
- a +% b とかくとオーバーフロしたときにエラーにならずwraparound。飽和演算もある。
- 関数引数はimmutable。
- グローバル変数をローカル変数でshadowingは禁止。
- 未使用引数は明示的にすてないとだダメ。
- zigはひよったりしない。
- 夏ごろに流行った。
「機械語で書くRuby処理系のその後」 / monochrome
- monoruby: rubyのrust実装
ruby->ast->bytecode->interpreter ->JITcompilier
- クロージャをつくるとローカル変数がスタックからヒープに移動してフレームからのポインタがつけかわる。
- ループはLOOP_START,LOOP_ENDというバイトコードでかこまれている。
- 再コンパイル: JITコンパイルするときに実行されてないブロックがあると型情報がないのでコンパイルできず単にインタプリタを呼ぶだけのコードを入れる。数回通るとJITコンパイルが再実行される。
- CRuby 3.2.0-yjit デフォルトでJITはオフになっている。
- 再コンパイルで枝だけをコンパイルするのは難しいのでメソッド全体をコンパイルしなおしている。
- rubyのスタックとCPUのスタックを両方ハンドリングするのはむつかしいのでCPUスタックに統一している。
- JITコンパイル: いらなくなったコードを消す部分が本来は必要。
- JITに対する攻撃 jit spraying
休憩 10分
「異世界人のためのOSを作っていく(long version)」 / hsjoihs
- 架空世界創作をやっている
- 文字、発音、ゲームがある。
- 低レイヤからアセンブラとかつくっていたが他人の関心をひけないので高レイヤからせめてみる。
- グラフィカルシェルをMikanOSの上に移植したというかたち。
- デスクトップのアスペクト比を1:√2に
- デバッグビルドすると表示はasciiになる。
- 時刻の異世界設定はある。物理法則はおなじ設定。
- Rui Ueyama compilerbook any% 縛り実況
- 縛り実況: 設定を追加してゲームをむつかしくする
- 初見実況: はじめてのゲームを前提知識なしに。
- 「低レイヤを知りたい人のためのCコンパイラ作成入門」をゲームにする。
- 縛り: アセンブリではなくてELFを出力する、フォーマットを調べすぎてはいけない、ふたりで交互に実装することで可読性を担保
- アセンブリでコードを書いてコンパイルしてstipしてcmpして吐くELFのテンプレートにする。
- アセンブラ・リンカがいかに複雑な仕事をしていたかわかった。
- ふたりでやるとやりすぎて学業がおろそかになるのを回避できる。
- 異世界OSの実演
- 異世界ボードゲームの実演
「俺ASICと俺CPU "松竹V(しょうちくぶい)"」 / takeoka
- OpenEDA, OpenLANE
- ロジック部の開発フローはかなりOSSがある
- PDK(半導体プロセスの制約条件)
- GAFAはFPGAは遅くて電気をくうのでデータセンター利用は避けがち。
- エッジコンピューティングのアナログ混載も視野か?
- GNU Prologは論理推論で必要(世界でこっそりつかわれている?)
- ハードウェアマルチスレッド (OS不要)
- ハードウェアセマフォ
- LR/SC もある
- ROS2もハードウェア実装 (かなり小さな資源で実現できる)
音をアレする / KOBA789
- ミキサーは世紀末半導体不足のため金で解決しない(しかも高い)
- デジタルミキサーをつくるのはたいへん
- USB Device Classes: 汎用デバイスの規格群
- USB Audio Class:
- terminalという概念がある
- I2S: デジタル音声規格
- サポートターゲット 13種類
- apt-get install gcc-aarch64-linux-gnu でクロスコンパイラがふつうにはいる
- gdb-multiarch でリモートデバッグ
- PC相対で飛べないとき: range extension thunkを生成して経由する。 ベニアとかいってり
- ARM32: ARMとThumbモードの切り替えはjumpのついでにやる。アドレスのLSBがThumbの区別になっている。リンク時にモードきりかえあり/なし命令が決まる。
- SPARC64はCALL はMSB 01 でアドレスに30bitもつかえる。アドレスLSB2bitはアラインされていて00なので実質どこでもとべるが、命令の1/4の空間をcallにつぶしてしまったのは良いトレードオフだったかは不明。
- RISC-Vは移植難易度が高い。range extension thunkとは逆のやりかたで近いときはリンカがjump命令を短かくする。
- 64bit PowerPC ELFv1: では関数ポインタは関数のアドレスと%r2(GOT)のタプルになっている。
- SH-4: ドキュメントが貧弱でまちがいもおおい
- リンカ移植はCPUに詳しい人にまかせるよりリンカの作者がちょっと勉強して移植するのが速い。
- MIPS, PA-RISCは標準から逸脱していて移植がむつかしいが。
- 要望: PC相対load/store命令は必ず必要。
- moldのプログラムはテンプレートになっているのでターゲットごとにインスタンス化される。
- C++20の機能をつかってエレガントに移植できるようになっている。
- ほかのリンカが複雑なのはベンダーが個別に移植しているのでどうしてもコードが増える。
- ubuntu,suseがサポートしているarchはmoldでもサポートしたい。どのarchもサポートしていると(自動ビルドの関係から)採用してもらいやすい。
- moldの移植コード400行が資料としての価値がでてくる。
- 有償版: sold
- modl: githubスポンサー $3500/月
クロージング
- 次回4月中頃の予定