2017/02/15

AArch64 armasm の勉強 システムレジスタ編

BareMetalで遊ぶ Raspberry Pi - 達人出版会 を参照しながら Raspberry Pi 3 Model B+ でベアメタルタイマー割り込みやろうとしたのだけど、 AArch64 でやろうとするといろいろ勝手が違うらしいのでそこのところを勉強する。

元ネタ資料はこれら

レジスタ概要を把握するため、ARM Information Center - 章 4 AArch64 状態の概要 を一通り読んだ。

不正確な箇条書きで書くとこんな感じらしい。

  • レジスタ概要
    • 汎用レジスタ 30 本
      • プログラム内で好き勝手適当に使えるレジスタ群
      • X30 で 64 bit レジスタとしてアクセス
      • W30 で 32 bit レジスタとしてアクセス(上 32 bit はゼロクリアされる)
      • X30, W30 はリンクレジスタ
    • PC(プログラムカウンタ)
      • 次に実行するアドレスが格納されるレジスタ
      • 直接値を変更することはできない、特定の命令で書き換えるらしい
    • SP(スタックポインタレジスタ)
      • スタックを実現するために使うレジスタ
      • 命令一つで格納とインクリメントをしてくれるとかそういうの???
      • サブルーチンの引数なんかをスタックするのに使うらしい
      • 例外レベル 0 から 3 までにそれぞれ専用のレジスタをもつ
      • アセンブラの命令によっては X31, W31 でアクセスできるらしい
    • SPSR(セーブドプログラムステータスレジスタ)
      • 例外発生時にその時点での状態を記録してくれるレジスタ
      • 例外レベル 1 から 3 までに専用のレジスタが一つずつある
      • 例外が発生すると、現在のステータスが遷移先の SPSR に格納される
      • SPSR が格納する情報は下記の通り
        • N, Z, C, V フラグ
        • D, A, I, F 割り込み Disable ビット
        • レジスタ幅
        • 実行モード
        • IL, SS ビット
    • LR(リンクレジスタ)
      • サブルーチン呼び出し時に復帰アドレスを格納する
    • ELR(例外リンクレジスタ)
      • 例外発生時に復帰アドレスを格納する
      • 例外レベル 1 から 3 にそれぞれ専用のレジスタがある
        • 設定によっては例外レベルでレジスタを使い分けないこともできるらしい
  • 例外レベルとは
    • それぞれのレベルで下記のような感じらしい。それぞれの意味はよく分からない。
      • EL0 : アプリケーション
      • EL1 : 特権付き
      • EL2 : ハイパーバイザ
      • EL3 : セキュアモニタ
  • AArch64 でのプロセス状態書き込み・読み込み方法
    • プロセス状態としてアクセスできる情報は下記の通り
      • N,Z,C,V フラグ(NZCV)
      • 現在のレジスタ幅(nRW)
      • スタックポインタ選択ビット(SPSel)
      • 割り込み Disable フラグ(DAIF)
      • 現在の例外レベル(EL)
      • シングルステッププロセス状態ビット(SS)
      • 不正な例外復帰状態ビット(IL)
    • MSR 命令で書き込めるもの
      • NZCV
      • DAIF
      • SPSel(EL1以上)
    • MRS 命令で読み取れるもの
      • NZCV
      • DAIF
      • CurrentEL の例外レベルビット(EL1 以上)
      • SPSel(EL1 以上)

BareMetalで遊ぶ Raspberry Pi - 達人出版会 内で CPSR にアクセスしている部分は、大体 MSR, MRS で置き換えられるのかな?

ARM Information Center - ARM Cortex-A53 MPCore Processor Technical Reference Manual に書かれているレジスタなんかも、 MSR, MRS 命令で読み書きするみたい。

とりあえず今日はここまで。

0 件のコメント: