64位程序怎么判断指针是否有效_AArch64应用程序级编程模型
根據實現選擇,體系結構支持多級執行特權,由從EL0到EL3的不同異常級別表示。EL0對應于最低的特權級別,通常被描述為無特權。應用層程序員模型是在EL0上執行軟件的程序員模型。
系統軟件決定異常級別,因此決定軟件運行的特權級別。當操作系統同時支持EL1和EL0執行時,應用程序通常在EL0上運行。
- 允許操作系統以唯一的或共享的方式將系統資源分配給應用程序。
- 從其他進程中提供一定程度的保護,因此有助于保護操作系統免受軟件故障的影響。
在EL0之上的任何異常級別執行通常被稱為特權執行。
Registers in AArch64 state
R0-R30
31個通用寄存器,從R0到R30。每個寄存器可按以下方式訪問:
一個64位通用寄存器,名為x0到x30。
一個32位通用寄存器,名為W0到W30。
X30通用寄存器用作過程調用鏈接寄存器。
在指令編碼中,值0b11111(31)用來表示ZR(零寄存器)。這表示參數接受值0,但不表示ZR是作為物理寄存器實現的。
SP
一個64位專用堆棧指針寄存器。堆棧指針最低有效的32位可以通過寄存器名WSP訪問。
在指令中使用SP作為操作數,表示使用當前堆棧指針。
堆棧指針對齊到16字節邊界在EL1是可配置的。
PC
保存當前指令地址的64位程序計數器。
軟件不能直接寫入PC。它只能在分支、異常條目或異常返回上更新。
試圖執行未按字對齊的A64指令會產生PC對齊錯誤
V0-V31
32個SIMD&FP寄存器,從V0到V31。每個寄存器可按以下方式訪問:
- A 128-bit register named Q0 to Q31.
- A 64-bit register named D0 to D31.
- A 32-bit register named S0 to S31.
- A 16-bit register named H0 to H31.
- An 8-bit register named B0 to B31.
- A 128-bit vector of elements.
- A 64-bit vector of elements.
當寄存器名所描述的位的數量不占據整個SIMD&FP寄存器時,它指的是最不重要的位。
FPCR, FPSR兩個SIMD和浮點控制和狀態寄存器
Process state, PSTATE
處理狀態或PSTATE是處理狀態信息的抽象。所有的指令集都提供了操作PSTATE元素的指令。
以下PSTATE信息可通過EL0訪問:
狀態標志
標志設置指令設置這些。它們是:
N :負狀態標志。如果指令的結果是2的帶符號整數,則PE將其設為:
1:如果結果是負數。
0:如果結果是正的或零。
Z :零狀態標志。
1:如果指令的結果是零。
0:如果指令的結果不是零。
結果為零通常表示比較結果相等。
C:進位狀態標志。設置為:
1:如果指令導致一個進位條件,例如一個由加法產生的無符號溢出。
0: otherwise.
V:溢出狀態標志。設置為:
1:如果指令導致溢出,例如由加法產生的帶符號溢出。
0: otherwise
條件指令測試N、Z、C和V條件標志,并將它們與指令的條件代碼組合起來,以確定指令是否必須執行。這樣,指令的執行取決于前一個操作的結果。
異常屏蔽位
D:調試異常掩碼位。當啟用EL0來修改掩碼位時,該位是可見的,可以修改。但是,EL0在體系結構上忽略了這一點。
A: SError中斷掩碼位。
I:IRQ中斷掩碼位。
F: FIQ中斷掩碼位。
每一位的值是:
0:異常不被屏蔽。
1:異常被屏蔽。
使用AArch64狀態訪問EL0取決于SCTLR_EL1.UMA。
在EL0訪問PSTATE字段
在使用AArch64狀態的EL0上,可以使用特殊用途的寄存器來訪問PSTATE字段,可以使用MRS指令直接讀取PSTATE字段,并使用MSR (register)指令直接寫入PSTATE字段了在PE位于EL0時使用AArch64訪問保存AArch64狀態的PSTATE字段的專用寄存器。所有其他PSTATE字段在EL0上沒有直接讀寫訪問。
軟件也可以使用MSR (immediate)指令直接寫入PSTATE.{D, A, I, F}。可以直接寫入PSTATE. {D, A, I, F} 的MSR (immediate)操作數。當PE在EL0使用AArch64狀態。
但是,訪問PSTATE.{D, A, I, F}字段在EL0使用AArch64狀態取決于SCTLR_EL1.UMA。
對PSTATE字段的寫操作對PE操作的各個方面都有副作用。所有這些副作用,是有保證的:
- 對執行流中較早的指令不可見。
- 對執行流中的后續指令可見。
System registers
系統寄存器為執行控制、狀態和一般系統配置提供支持。在EL0中,大多數系統寄存器是不可訪問的。
然而,一些系統寄存器可以配置為允許從在EL0執行的軟件進行訪問。從EL0到系統寄存器的任何訪問都禁用了訪問權限,這將導致指令表現為未定義。可以從EL0訪問的寄存器有:
Cache ID registers
CTR_EL0和DCZID_EL0寄存器為EL0緩存管理支持提供實現參數。
Debug registers
MDCCSR_EL0、DBGDTR_EL0、DBGDTRRX_EL0和DBGDTRTX_EL0寄存器支持調試通信通道。
Performance Monitors registers
Performance Monitors擴展提供計數器和配置寄存器。在EL1或更高的異常級別執行的軟件可以將其中一些寄存器配置為可在EL0訪問。
Activity Monitors registers
活動監視器擴展提供計數器和配置寄存器。在EL1或更高的異常級別執行的軟件可以將這些寄存器配置為可在EL0訪問。
Thread ID registers
TPIDR_EL0和TPIDRRO_EL0寄存器是兩個具有不同訪問權限的線程ID寄存器。
Timer registers
在ARMv8中執行以下操作:
- 使用CNTFRQ_EL0讀取對系統時鐘頻率的訪問。
- 物理和虛擬計時器計數寄存器,CNTPCT_EL0和CNTVCT_EL0。
- 物理上計數比較、下計數值和計時器控制寄存器CNTP_CVAL_EL0、CNTP_TVAL_EL0和CNTP_CTL_EL0。
- 虛擬計數比較、下計數值和計時器控制寄存器CNTV_CVAL_EL0、CNTV_TVAL_EL0和CNTV_CTL_EL0。
軟件控制功能和EL0
異常處理
在Arm架構中,異常會導致程序流的更改。異常處理程序的執行從與所采取的異常相關的已定義向量開始,其異常級別高于EL0。
異常包括:
- Interrupts.
- Memory system aborts.
- 試圖執行未定義的指令時生成的異常。
- 系統調用。
- Secure monitor or Hypervisor traps.
- Debug exceptions.
異常處理的大多數細節對應用程序級軟件是不可見的,
SVC指令導致一個管理器調用異常。這為非特權軟件提供了一種對操作系統進行系統調用的機制。
BRK指令生成一個斷點指令異常。這提供了一種使用在相同PE上執行的調試器來調試軟件的機制,
BRK指令只支持A64指令集。T32和A32指令集中的等效指令是BKPT。
等待中斷和事件
發出WFI指令表示在WFI喚醒事件發生之前不需要進一步執行,這允許進入低功率狀態。
發出WFE指令表示在WFE喚醒事件發生之前不需要進一步執行,這允許進入低功率狀態。
The YIELD instruction
YIELD指令提供了一個提示,說明線程執行的任務的重要性很低,因此它可以YIELD,這種機制可用于提高對稱多線程(SMT)或對稱多處理(SMP)系統的整體性能。
YIELD指令可能被使用的例子包括位于自旋鎖中的線程,或者SMP系統中snoop位的仲裁優先級被修改的地方。YIELD指令允許SMT和SMP系統之間的二進制兼容性。
YIELD指令是一個NOP (無操作)提示指令。
YIELD指令在單線程系統中沒有任何作用,但是這類系統的開發人員可以使用該指令來標記將來遷移到多處理器或多線程系統的預期用途。操作系統可以在需要YIELD提示的地方使用YIELD,因為它們知道,如果沒有實現上的好處,那么它將被視為NOP。
應用程序級緩存管理
在EL0上,可以使用SCTLR_EL1系統寄存器從更高級別的特權啟用少量緩存管理指令。從EL0到禁用訪問權限的操作的任何訪問都將導致該指令表現為未定義的。
與調試相關的說明
引用BRK指令,BRK指令生成斷點指令異常。此外,在AArch64狀態和AArch32狀態下,HLT指令會導致PE停止執行并進入調試狀態。這為使用PE外部的調試器調試軟件提供了一種機制
在AArch32狀態下,以前版本的體系結構定義了DBG指令,這可以為調試系統提供提示。在ARMv8中,這條指令作為NOP執行。Arm不贊成使用DBG指令。
關于 PSTATE.DIT
Data Independent Timing (DIT) bit.
只有在實現ARMv8.4-DIT時才會實現這個位。
在重置為AArch64狀態時,該位設置為0。
為數據處理指令提供了獨立的定時功能
PSTATE。說,CPSR。說字段。
當 PSTATE.DIT為1時:
- DIT中列出的指令是必須要有的;
- 與任何寄存器中提供的數據值和NZCV標志的值無關的時序。
- 對異步異常的響應不會根據其寄存器中提供的值或NZCV標志的值而變化。
- 所有加載和存儲都必須具有對加載或存儲的數據的值不敏感的定時。
ARM建議ARMv8.3指針身份驗證指令的時間不依賴于指針身份驗證中使用的鍵值,而與PSTATE.DIT無關。
當PSTATE.DIT的值是0,架構沒有聲明任何指令的時序屬性。然而,這些指令很可能具有在許多情況下數據不變的時序。
對應的DIT位被添加到AArch64狀態的PSTATE和AArch32狀態的CPSR。
當異常從AArch64狀態轉移到AArch64狀態時,PSTATE.DIT將它復制到SPSR_ELx.DIT。
當一個異常從AArch32狀態變為AArch64狀態時,CPSR.DIT將它復制到SPSR_ELx.DIT。
當一個異常從AArch64狀態返回到AArch64狀態時,SPSR_ELx.DIT復制到PSTATE.DIT。
當一個異常從AArch64狀態返回到AArch32狀態時,SPSR_ELx.DIT它被復制到CPSR.DIT。
PSTATE.DIT 它可以在所有異常級別讀寫。
PSTATE.DIT 進入調試狀態時DIT沒有改變。
PSTATE.DIT 它不能保證在調試狀態下有任何效果。
總結
以上是生活随笔為你收集整理的64位程序怎么判断指针是否有效_AArch64应用程序级编程模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gnss单频软件接收机应用与编程_GNS
- 下一篇: 英特尔显示器音频_英特尔也玩马甲?有关U