by shigemk2

当面は技術的なことしか書かない

総当りARM64 #kernelvm

@7shi

ARM64

  • 64bit ARMは最後発のISA
  • ISAはややこしいので以後ARM64とする
  • 実用性と美しさを兼ね備えているらしい

計画

  • 逆アセンブラは入手可能 binutilsを--target=aarch64-elfでビルド
  • ARM64の命令は4バイト固定長(43億通り)

調査

  • 00000000-FFFFFFFFのバイナリを作って逆アセンブル
  • 逆アセンブル結果は200GB
  • バイナリ16GB
  • Athlonなので遅い

データを削る

  • 逆アセ結果からデータを削る
  • 約7割が未定義なので削る
  • 未定義データを削ると35GBに縮小

パターン抽出

  • ニーモニックごとにパターンを抽出
  • ニーモニック単位のビット部はなさそう
  • 逆アセンブラを作るのは難しそう

パターン抽出

(分岐)

分岐はARM32で最上位にあった条件ビットと同じパターンが最下位にある

b.eq b.ne b.cs b.cc b.le b.al b.nv

(オペランド)

(スクリプトはF#で)

適当に書いたらあまり高速化しなかった

組み合わせ爆発!

31番レジスタあたりにアタリをつけてみる

31番レジスタは状況に応じて別物になる アドレッシングでは必ず[sp] spは以下の10命令にしか現れない

add adds and cmn cmp eor mov orr sub subs

PowerPCにも似た仕様がある

31番レジスタ

ゼロレジスタがデフォルトで、一部の命令に限ってspが出てくる

どこかに判別ビットがあるはずだが、統一ルールみたいなのはない

付加的な操作

ARMの伝統で一部の命令はオペランドに対してシフトや拡張の操作ができる

これと31番レジスタとの合わせ技が組み合わせ爆発の原因

課題