Upgrade to Pro — share decks privately, control downloads, hide ads and more …

三人寄ればチューリング完全

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 三人寄ればチューリング完全

Kernel/VM探検隊@東京 No. 19
2026/08/22

Avatar for Takumi Sueda

Takumi Sueda

August 21, 2026

More Decks by Takumi Sueda

Other Decks in Technology

Transcript

  1. RP2 と DMA DMA とは? • 計算で忙しい CPU の代わりに、あるアドレ スから別のアドレスへデータをコピーしてく

    れる仕組み • 現代の MCU や SoC には必ず存在する • 大抵の場合、CPU がアクセス可能 (addressable) な場所は DMA も読み書きで きる • RAM に限らず、ペリフェラルのレジスタも読 み書きできる(重要) 8
  2. RP2 と DMA 13 以下、引用と抄訳: • DMA は、CPUとは別のメモリコントローラを使用して、メモリ領域間あ るいは周辺機器とメモリ間のデータ転送を高速化する技術です。 >

    DMA uses memory controllers separate from the CPU to accelerate data movment between memory locations, or between peripherials and memory. • ここでは、DMAサブシステムを活用して、メインのARM CPUとは独立し た完全な計算システムを構築します。 > Here we use the DMA subsystem to produce a complete computing system, independent of the main ARM cpus. • 実装された処理はチューリング完全です。 > The implemented operations are Turing Complete.
  3. 19 SNIFF̲DATA による加算と減算 SNIFF̲DATA とは? • DMA が値をコピーするとき、その横からデータをかすめ取って 順次加算していくレジスタ…つまりアキュムレータ 0x00000001

    0x00000001 0x00000001 0x00000001 4 word コピー 加算 アドレス A ~ A + 3 0x00000001 0x00000001 0x00000001 0x00000001 アドレス B ~ B + 3 0x00000004 SNIFF̲DATA 👈 1を4つコピーしたので 合計 0x4 になる
  4. 24 SNIFF̲DATA による加算と減算 DMA とレジスタアクセスだけで2の補数を作る • 任意のレジスタのアドレス + 0x1000 に値を書き込むと、元々レジスタに

    入っていた値を書き込んだ値で XOR できる "Atomic register access" 機能 • • SNIFF̲DATA + 0x1000 に 0xFFFFFFFF を書き込めばビットが反転できる 反転後 0x1 を適当な場所にコピーすると1が足され2の補数が完成 SNIFF̲DATA 0x50000458 0x00000004 ↓ 0x50001458 (+0x1000) に 0xFFFFFFFF を書き込む ↓ SNIFF̲DATA 0x50000458 0xFFFFFFFB ↓ DMA を使い適当な場所間で 0x00000001 をコピーする ↓ SNIFF̲DATA 0x50000458 0xFFFFFFFC
  5. 28 DMA の連結と閉ループ化 • DMA channel 1 を "Fetch", channel

    2 を "Execute", channel 3 を "Fix Write Address"と呼ぶことにする • DMA の動作を決めるレジスタ4つをまとめて "DMA Control Block" と 呼ぶことにする DMA Control Block READ̲ADDR READ̲ADDR READ̲ADDR WRITE̲ADDR WRITE̲ADDR WRITE̲ADDR TRANS̲COUNT TRANS̲COUNT TRANS̲COUNT CTRL CTRL CTRL Fetch Execute Fix Write Address
  6. 29 DMA の連結と閉ループ化 • • • Fetch: Execute の DMA

    Control Block を書き込む Execute: 書かれたコピー処理を実行する Fix Write Address: Fetch の書き込み先を再び Execute に向ける READ̲ADDR Control Block 置き場 WRITE̲ADDR Execute のレジスタ TRANS̲COUNT CTRL Fetch 4 RD&WR auto incr. Chain 書く READ̲ADDR {Fetch が指定} WRITE̲ADDR {Fetch が指定} TRANS̲COUNT {Fetch が指定} CTRL {Fetch が指定} READ̲ADDR 固定 WRITE̲ADDR Fetch.READ̲ADDR TRANS̲COUNT CTRL 1 なし Fix Write Address Chain Execute
  7. 30 DMA の連結と閉ループ化 • つまり、「プログラムを fetch する人」「Fetch されたプログラムを実行する人」 「Fetch の動作が継続するよう修正する人」の閉ループが成り立つ

    • Fetch の READ̲ADDR はインクリメントし続ける; Program Counter と等価 READ̲ADDR Control Block 置き場 WRITE̲ADDR Execute のレジスタ TRANS̲COUNT CTRL Fetch 4 RD&WR auto incr. Chain 書く READ̲ADDR {Fetch が指定} WRITE̲ADDR {Fetch が指定} TRANS̲COUNT {Fetch が指定} CTRL {Fetch が指定} READ̲ADDR 固定 WRITE̲ADDR Fetch.READ̲ADDR TRANS̲COUNT CTRL 1 なし Fix Write Address Chain Execute
  8. 33 制御構造の実装: 条件なしジャンプ • Execute が Fetch の READ̲ADDR (program

    counter) を書き換えれば 好きな場所にジャンプできる • 同様に無条件の無限ループもできる 1. READ̲ADDR を書き換える READ̲ADDR Control Block 置き場 READ̲ADDR {Fetch が指定} WRITE̲ADDR Execute のレジスタ WRITE̲ADDR {Fetch が指定} TRANS̲COUNT {Fetch が指定} CTRL {Fetch が指定} TRANS̲COUNT CTRL 4 RD&WR auto incr. Fetch Execute 2. ジャンプ先アドレスにある Control Block を Execute に書き込む
  9. 制御構造の実装: 条件ありジャンプ • SNIFF̲DATA への値の加算方法を設定する SNIFF̲CTRL レジスタの 35 BSWAP を有効化して、SNIFF̲DATA

    に入る数のエンディアンをスワップさせる • ここで、ある数 x (ただし |x| < 228) を SNIFF̲DATA に入れると SNIFF̲DATA の bit 7 から 4 が符号ビットになる たとえば -999 = 0xFFFFFC19 を BSWAP 有効の SNIFF̲DATA に入れたとすると SNIFF̲DATA 0x19FCFFFF 符号ビット 4 bit 分
  10. 制御構造の実装: 条件ありジャンプ • SNIFF̲DATA の XOR 演算で使用した Atomic register access

    の機能 "bitmask clear" 機能 (+0x3000) を使い bit 4 だけを取り出すと SNIFF̲DATA の内容は元々入っていた数字に応じて 0x00 か 0x10 になる SNIFF̲DATA (BSWAP) 0x00000000 もしくは SNIFF̲DATA (BSWAP) 0x00000010 36
  11. 37 制御構造の実装: 条件ありジャンプ • SNIFF̲DATA の 0x00 もしくは 0x10 に

    Fetch の READ̲ADDR を足すと SNIFF̲DATA は「READ̲ADDR そのまま」もしくは「READ̲ADDR + 0x10」 になる ※ BSWAP は事前に無効化しておく 0x10000000 コピー Fetch.READ̲ADDR SNIFF̲DATA 適当な場所 0x10000000 もしくは SNIFF̲DATA 0x10000000 0x10000010
  12. 制御構造の実装: 条件ありジャンプ • • 38 ところで、0x10 Bytes = 16 Bytes

    は DMA control block 1つ分の大きさと同じ つまり数字の正負により、次に fetch する control block の位置が選べる READ̲ADDR (PC) Control block もし計算結果が正なら 直後のブロックを続行 Control block もし計算結果が負なら 直後のブロックを飛ばして続行 Control block
  13. 制御構造の実装 39 その他の演算 ビット演算 • OR, NOT: Atomic register access

    の SET, XOR に対応 • AND • A & NOT(B): Atomic register access の CLR (clear) に対応 • A & B: A & NOT(NOT(B)) • 左論理シフト: A << 1 = A + A • 右論理シフト: SNIFF̲CTRL.OUT̲REV でビットの並びを左右逆にして左シフト ジャンプ • 負ならジャンプ(任意の x): 128 Bytes 先に着地ポイントを置けば任意の x が 比較可能 • 二値が不等ならジャンプ: (A - B) OR (B - A) の符号ビットを取り出せばよい • その他、数値比較は符号判定と AND, OR, NOT, XOR で実装可能
  14. チューリング完全なら… 1. C コンパイラ 45 C言語 LLVM LLVM IR dmacc

    ".dasm"(DMA を若干抽象化した疑似 ISA) dmaasm ".dmx"(再配置可能な DMA Control Block 用実行ファイル)
  15. チューリング完全なら… 2. OS 実はこのプレゼンは DMA CPU + xv6 の上で動く RP2

    専用に作った 画像ビューアーで行われています 51