2015-08-03 55 views
2

我是ARMv8架構的新手。我在腦海中有以下基本問題:什麼是當前執行模式/異常級別等?

  1. 如何知道當前執行模式AArch32或AArch64是什麼?我應該閱讀CPSR還是SPSR來確定?

  2. 什麼是當前異常級別EL0/1/2/3?

  3. 一旦發生異常,我可以讀取任何寄存器以確定我是否處於Serror/Synchronous/IRQ/FIQ異常處理程序。

TIA。

+2

「我怎麼知道當前的執行模式AArch32或AArch64?」 - 我想如果代碼試圖檢查模式是編譯爲64位,模式是64位;如果它編譯爲32位,則該模式爲32位。 – JimmyB

回答

3
  1. 對於32位和64位,彙編指令及其二進制編碼完全不同。因此,您目前所處的模式是編譯器在編譯過程中需要了解的信息。在運行時檢查它們是沒有意義的。爲C,C++檢查可以在編譯時(#ifdef)通過像由armclang提供的那些編譯器提供的宏完成:__aarch64__爲64位,__arm__爲32位
  2. 依賴於執行模式:
    • aarch32: MRS <Rn>, CPSR將當前狀態讀入寄存器編號n。然後提取包含當前模式的位3:0。
    • aarch64:MRS <Xn>, CurrentEL讀取當前EL到寄存器個數n
  3. 答案很簡單:你不能。長答案:假設是通過代碼的結構和任何用戶定義的變量的狀態,你已經知道你在做什麼。即您是否通過常規代碼或異常來到代碼中。
+0

對於第二點,通過讀取CPSR寄存器,我可以在EL1,EL2或EL3模式下找到當前模式。但是,如果我在EL0模式下讀取cpsr會導致異常。 – chetan

+0

@chetan:「如果我在EL0模式下讀取cpsr會導致異常。」 AFAIK,這當然是整個重點! EL0是非特權的「應用程序」模式;應用程序不能/不能有權訪問這樣的信息。因此,我的理解是,編寫一個內核模塊來讀取寄存器值。它應該在EL1中運行,如果不是EL2。 – kaiwan