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

5分でわかるPage-Fault Weird Machine

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Arata Arata
March 21, 2026
110

5分でわかるPage-Fault Weird Machine

Avatar for Arata

Arata

March 21, 2026
Tweet

More Decks by Arata

Transcript

  1.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata movdbz dst, src, label_zero,

    label_nonzero 意味: • srcをデクリメントしてdstに書き込み、 ◦ dst > 0 ならば label_nonzeroにジャンプする ◦ dst = 0 ならば label_zeroにジャンプする • 要するにデクリメントと分岐ができる movdbz命令 4
  2.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • x86ではページテーブルを使って仮想アドレスを物理アド レスに割り当てる •

    割り当てられていない仮想アドレスにアクセスすると、 ページフォルトという例外が発生する x86速習(1/3): ページフォルト 5 割り当て済み 未割り当て OK ページフォルト
  3.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • 例外が起きるとCPUは例外ハンドラを呼び出す • x86ではハンドラとしてタスクスイッチを行える

    • 例 ◦ #PF (ページフォルト)発生 → タスクAに切り替え ◦ #DF (ダブルフォルト)発生 → タスクBに切り替え x86速習(2/3): 例外ハンドラ 6
  4.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • レジスタの値を入れ替える機能 • タスク毎のTSSを用意して保存・復元

    タスクスイッチ時の動作 1. レジスタを今のタスクのTSSに保存 2. 次のタスクのTSSからレジスタを復元 x86速習(3/3): タスクスイッチ 7 TSS
  5.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • movdbz1命令ごとにタスクと例外ハンドラを用意 • ページフォルトをトリガとしたタスクスイッチを繰り返

    して計算を進める • ESPを(movdbzの世界の)レジスタとして用いる movdbz命令の構成 8 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
  6.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata Q1. ページフォルトを発生させる方法 Q2. デクリメントの実現方法

    Q3. 分岐の実現方法 movdbz命令の構成 9 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
  7.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata Q1. ページフォルトを発生させる方法 Q2. デクリメントの実現方法

    Q3. 分岐の実現方法 movdbz命令の構成 10 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
  8.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata タスクのEIP(命令ポインタ)を未割り当てのアドレスに設 定しておく → タスクスイッチ直後にEIPを読んで命令をフェッチ

    → 未割り当てなのでフェッチできない → ページフォルトが発生 タスクスイッチ直後にページフォルトを起こせる movdbz命令の構成: ページフォルト 11
  9.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata ✅ Q1. ページフォルトを発生させる方法 Q2.

    デクリメントの実現方法 Q3. 分岐の実現方法 movdbz命令の構成 12 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
  10.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata ✅ Q1. ページフォルトを発生させる方法 ✅

    Q2. デクリメントの実現方法 Q3. 分岐の実現方法 movdbz命令の構成 14 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
  11.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata #PF時にESP=0だとダブルフォルトが発生することを利用 • ESP >

    0の場合 ◦ ESP -= 4 ◦ ページフォルト発生 • ESP = 0の場合 ◦ ESP -= 4 → オーバーフローするので実行できない! ◦ ダブルフォルト発生 ESP>0かどうかで#PF,#DFどちらかのハンドラが実行される ref: https://hikalium.github.io/opv86/sdmparser/pdf/325383-sdm-vol-2abcd.pdf#page=1253 movdbz命令の構成: 分岐 15
  12.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • タスク1にスイッチ ◦ EIPが未割り当てアドレスなのでページフォルト発生

    ◦ error codeをスタックにプッシュしようとする(分岐) ▪ ESPが0より大きい • プッシュに成功する(デクリメント) • #PFのハンドラ実行 • タスク2にスイッチ ▪ ESPが0と等しい • プッシュに失敗する • #DFのハンドラ実行 • タスク3にスイッチ movdbz命令の構成: まとめると 16
  13.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • IDTの変更には通常lidt命令の実行が必要 ◦ 一方で、もちろん命令は実行したくない

    • TSSのCR3でページテーブルを切り替えられることを利用 • 各タスクのページテーブルで、IDTを0x40000にマップす るよう設定 • タスクスイッチでCR3が切り替わり、自動でそのタスク に対応するIDTが参照される 付録: タスクごとにIDTを切り替える方法 18
  14.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • タスクスイッチでタスクにbusy flagが立ち、そのタスク にスイッチできなくなる

    • TSSのEAXと、GDT descriptorを同じ物理アドレスに マップするよう設定しておく ◦ また、EAXをbusy flagなしのdescriptorの値に設定しておく ◦ これでレジスタの保存でbusy flagがクリアされるようになる • 1つのタスクはbusy flagが立っているので、TSSをマップ するスロットが最低3つは必要になる 付録: TSSのbusy flagの回避 19
  15.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • タスクスイッチでESPの値も保存・復帰されてしまうた め、複数タスクでESPを共有できない •

    TSSをページ境界を跨ぐように配置し、ESP以前と以降を 別のページにマップする • これでESPを特定の物理アドレスにマップできるので、同 じ物理アドレスにマップするよう設定すれば複数のタス クでESPを共有できる 付録: 複数のタスクでESPを共有する方法 20
  16.  2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • https://www.usenix.org/system/files/conference/wo ot13/woot13-bangert.pdf •

    https://github.com/kristerw/instless_comp ◦ https://kristerw.blogspot.com/2015/08/instruction-less-c omputation.html ◦ https://kristerw.blogspot.com/2015/08/instruction-less-c omputation-technical.html • https://github.com/jbangert/trapcc 参考文献 21