ラズベリーパイ3のメモ(ARMv8の実行状態,例外レベルとか)
実行状態 Execution state
・2種類の実行状態がある.
AArch32 state | 32ビット汎用レジスタにアクセスできる A32およびT32命令セットのみを使用できる |
AArch64 state | 64ビット汎用レジスタにアクセスできる A64命令セットのみを使用できる |
・(AArch32 stateにはさらに,A32 stateとT32 stateがあるが省略)
例外レベル Exception Level
・以下の表のように,4種類の例外レベルがある
例外レベル | 一般的な使用用途 |
EL0 | アプリケーション |
EL1 | OSカーネル |
EL2 | ハイパーバイザ |
EL3 | セキュアモニタ |
・例外レベルが上がるに従い,アクセスできるシステムレジスタが増える
実行状態の変更方法
・AArch32およびAArch64状態の切り替えは、例外の境界でのみ発生する
・より高い例外レベルへリターンしたときに,AArch32⇒AArch64に変更できる
(例)
EL0レベルで例外が発生しEL1レベルにリターンしたときに,AArch32⇒AArch64に変更できる
・より低い例外レベルへリターンしたときに,AArch64⇒AArch32に変更できる
(例)
EL3レベルで例外が発生しEL2レベルにリターンしたときに,AArch64⇒AArch32に変更できる
スタックポインタレジスタ Stack Pointer register
・以下の表のように,各例外レベルに個別のスタックポインタがある
例外レベル | SPレジスタの名前(64bit) |
EL0 | SP_EL0 |
EL1 | SP_EL1 |
EL2 | SP_EL2 |
EL3 | SP_EL3 |
・2通りのSPレジスタの選択方法(なぜ2通りあるのか?)
EL0t | EL0レベルでSP_EL0を使用 |
EL1t | EL1レベルでSP_EL0を使用 |
EL2t | EL2レベルでSP_EL0を使用 |
EL3t | EL3レベルでSP_EL0を使用 |
EL0h | なし |
EL1h | SP_EL1を使用 |
EL2h | SP_EL2を使用 |
EL3h | SP_EL3を使用 |
例外ベクタテーブル
例外が発生した例外レベル | Synchronous | IRQ or vIRQ | FIQ or vFIQ | SError or vSError |
現在の例外レベル(SP_EL0を使用したい) | 0x000 | 0x080 | 0x100 | 0x180 |
現在の例外レベル(SP_ELxを使用したい) | 0x200 | 0x280 | 0x300 | 0x380 |
? | 0x400 | 0x480 | 0x500 | 0x580 |
?|0x600|0x680|0x700|0x780|