ARMv8-AArch64簡述

ARMv8是ARM版本升級以來最大的一次改變,ARMv8的架構繼承以往ARMv7與之前處理器技術的基礎,除了現有的16/32bit的Thumb2指令支持外,也向前兼容現有的A32(ARM 32bit)指令集,擴充了基於64bit的AArch64架構,除了新增A64(ARM 64bit)指令集外,也擴充了現有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集;

這裏寫圖片描述

ARMv8擁有兩種執行模式(two execution modes):
AArch64 :64-bit registers and memory accesses, new instruction set;
AArch32 : backwards compatible with ARMv7-A;



(一)A64新的指令和寄存器


  1. 固定大小32位操作碼,清除基於5位寄存器說明符的解碼錶;
  2. 可以擁有32位或者64位參數;
  3. 地址設定爲64位,主要針對LP64和LLP64數據模型;
  4. 比AArch32擁有更少的條件指令,條件指令有:分支,比較,選擇;
  5. 沒有LDM/STM(用於批量從內存中讀取或者寫入數據)指令,添加LDP/STP指令來操作以降低複雜性及功耗;
  6. 支持先進的SIMD(Single-Instruction,Multiple-Data:單指令多數據)和(FP浮點);
  7. 支持加密技術;
  8. 可隨時訪問31個通用的64位寄存器 (X0-X30),沒有banked(banked是指一個寄存器不同模式下會對應不同的物理地址)的通用寄存器,堆棧指針(SP),PC不是通用寄存器,附加專用的零寄存器(Xzr);
  9. AArch32狀態是使用CPSR來存儲當前process執行狀態,AArch64定義了一組PSTATE寄存器用以保存PE(Processing Element)狀態;

AArch64 – Unbanked Registers:

這裏寫圖片描述

左邊的通用寄存器用於:32位或者64位的整數運算或者64位的尋址,右邊的用於浮點運算;

AArch64 Banked Registers:

這裏寫圖片描述

AArch64不在根據之前通過不同模式來區別banked寄存器,而是通過exception level;

下圖爲AArch32和AArch64通用寄存器對應關係:

這裏寫圖片描述



(二)AArch64 Exception Model


AArch64 Exception Model:

這裏寫圖片描述

Exception model nomenclature:

這裏寫圖片描述

總共分爲4 exception levels: EL3-EL0,在這種特權模式下EL0位權限最低模式,也就是用戶模式,Monitor(EL3)和Supervisor(EL2),分別用於security擴展和virtualization擴展;;低level向高level切換通過exception的方式轉換,有如下exceptions:

  1. Interrupts, page faults etc.
  2. SVC for transition to EL1 (system calls)
  3. HVC for transition to EL2 (hypervisor:超級監督者 calls)
  4. SMC for transition to EL3 (secure monitor call)
  5. Dedicated ELR register for the return address (banked at each EL);

而高level向低level則通過ERET指令;
低level的寄存器位寬不能大於高level:E.g. no 64-bit EL0 with 32-bit EL1;


對異常的處理:

1. Exception Link Register written on exception entry;
2. 異常有可能發生任何在exception level,EL1, EL2, and EL3有不同的向量表地址,之前的arm版本只有一個向量表地址;
3. 向量的區分是根據Exception type(synchronous, IRQ, FIQ or System Error)或者Exception origin (same or lower exception level) and register width;
4. Syndrome 寄存器提供了exceptions信息;

AArch32 and AArch64之間切換

這裏寫圖片描述

AArch32和AArch64之間的切換隻能通過發生異常或者系統Reset來實現,A32 -> T32之間是通過BX指令切換的;

不同level之間的組合:

這裏寫圖片描述

AArch32 /AArch64 relationship

  1. Changes between AArch32 and AArch64 occur on exception/exception return only;
  2. Allows AArch32 applications under AArch64 OS Kernel;
  3. Allows AArch32 guest OS under AArch64 Hypervisor;
  4. Allows AArch32 Secure side with AArch64 Non-secure side



(二)AArch64 MMU Support


在ARMv8 64bit出現之前,我們用的都是32位尋址,每個地址單位對應內存一個字節單元(B),所以我們最大的尋址範圍爲2^32B = 4GB,但是實際當中,內存設備有可能遠遠大於4GB內存空間,以前是通過LPAE(大物理地址擴展)實現地址的擴展,可以支持最大2^40的地址尋址範圍,ARMv8理論上最高可以提供提供了2^64個虛擬地址,但是超過16 Exabyte (2^4 * 2^60)意義並不大,所以選擇跟x86一樣,可以使用最大支持2^48虛擬地址的尋址範圍就足夠;

ARM 32bits下會用TTBR0存儲User-Space行程所在的Page Table (也就是0xC0000000以下的存儲空間),並用TTBR1存儲Kernel Space所在的Page Table (也就是0xC0000000以上的存儲空間).

這裏寫圖片描述

在ARMv8 64bits架構下,會通過EL1的TTBR0 (ttbr0_el1, in /arch/arm64/mm/proc).存儲User-Space行程所在的Page Table,與EL1的TTBR1存儲Kernel Space所在的Page Table,並會依據Page Size與32/64bits行程而有不同的存儲空間配置. 參考如下圖所示:

這裏寫圖片描述

由於ARM 64bit Kernel分頁大小爲4kb和64kb兩種,通過設置TASK_SIZE_64 (/arch/arm64/include/asm/memory.h)來設定,當分頁大小爲4KB的時候,決定TASK_SIZE_64大小的VA_BITS會等於39,也就是2^39大小的Task空間(=512GB),若分頁大小爲64KB時,則TASK_SIZE_64對應的VA_BITS等於 42,也就是2^42大小的Task空間(=4TB).

這裏寫圖片描述

同時kernel空間也根據分頁大小來劃分內核空間,可以參考下面的圖來區分:
這裏寫圖片描述

參考資料:

ARM(V8) Architecture Reference Manual.pdf

ARMv8 Technology Preview.pdf

www.arm.com -cotex-A57介紹

Linux Support for ARM LPAE 分析

ARMv8 與 linux 的新手筆記

ARMv8 架構與指令集.學習筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章