帶你了解ARMv8-AArch64簡(jiǎn)介(超詳細(xì))
ARMv8是ARM版本升級(jí)以來(lái)最大的一次改變,ARMv8的架構(gòu)繼承以往ARMv7與之前處理器技術(shù)的基礎(chǔ),除了現(xiàn)有的16/32bit的Thumb2指令支持外,也向前兼容現(xiàn)有的A32(ARM 32bit)指令集,擴(kuò)充了基于64bit的AArch64架構(gòu),除了新增A64(ARM 64bit)指令集外,也擴(kuò)充了現(xiàn)有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集;

ARMv8擁有兩種執(zhí)行模式(two execution modes):
AArch64 :64-bit registers and memory accesses, new instruction set;
AArch32 : backwards compatible with ARMv7-A;
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!??!前100名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?

(一)A64新的指令和寄存器
固定大小32位操作碼,清除基于5位寄存器說(shuō)明符的解碼表;
可以擁有32位或者64位參數(shù);
地址設(shè)定為64位,主要針對(duì)LP64和LLP64數(shù)據(jù)模型;
比AArch32擁有更少的條件指令,條件指令有:分支,比較,選擇;
沒有LDM/STM(用于批量從內(nèi)存中讀取或者寫入數(shù)據(jù))指令,添加LDP/STP指令來(lái)操作以降低復(fù)雜性及功耗;
支持先進(jìn)的SIMD(Single-Instruction,Multiple-Data:?jiǎn)沃噶疃鄶?shù)據(jù))和(FP浮點(diǎn));
支持加密技術(shù);
可隨時(shí)訪問31個(gè)通用的64位寄存器 (X0-X30),沒有banked(banked是指一個(gè)寄存器不同模式下會(huì)對(duì)應(yīng)不同的物理地址)的通用寄存器,堆棧指針(SP),PC不是通用寄存器,附加專用的零寄存器(Xzr);
AArch32狀態(tài)是使用CPSR來(lái)存儲(chǔ)當(dāng)前process執(zhí)行狀態(tài),AArch64定義了一組PSTATE寄存器用以保存PE(Processing Element)狀態(tài);
AArch64 – Unbanked Registers:

左邊的通用寄存器用于:32位或者64位的整數(shù)運(yùn)算或者64位的尋址,右邊的用于浮點(diǎn)運(yùn)算; AArch64 Banked Registers:

AArch64不在根據(jù)之前通過(guò)不同模式來(lái)區(qū)別banked寄存器,而是通過(guò)exception level; 下圖為AArch32和AArch64通用寄存器對(duì)應(yīng)關(guān)系:

(二)AArch64 Exception Model
AArch64 Exception Model:

Exception model nomenclature:

總共分為4 exception levels: EL3-EL0,在這種特權(quán)模式下EL0位權(quán)限最低模式,也就是用戶模式,Monitor(EL3)和Supervisor(EL2),分別用于security擴(kuò)展和virtualization擴(kuò)展;;低level向高level切換通過(guò)exception的方式轉(zhuǎn)換,有如下exceptions:
Interrupts, page faults etc.
SVC for transition to EL1 (system calls)
HVC for transition to EL2 (hypervisor:超級(jí)監(jiān)督者 calls)
SMC for transition to EL3 (secure monitor call)
Dedicated ELR register for the return address (banked at each EL);
而高level向低level則通過(guò)ERET指令;
低level的寄存器位寬不能大于高level:E.g. no 64-bit EL0 with 32-bit EL1;
對(duì)異常的處理:
Exception Link Register written on exception entry;
異常有可能發(fā)生任何在exception level,EL1, EL2, and EL3有不同的向量表地址,之前的arm版本只有一個(gè)向量表地址;
向量的區(qū)分是根據(jù)Exception type(synchronous, IRQ, FIQ or System Error)或者Exception origin (same or lower exception level) and register width;
Syndrome 寄存器提供了exceptions信息;
AArch32 and AArch64之間切換

AArch32和AArch64之間的切換只能通過(guò)發(fā)生異?;蛘呦到y(tǒng)Reset來(lái)實(shí)現(xiàn),A32 -> T32之間是通過(guò)BX指令切換的;
不同level之間的組合:

AArch32 /AArch64 relationship:
Changes between AArch32 and AArch64 occur on exception/exception return only;
Allows AArch32 applications under AArch64 OS Kernel;
Allows AArch32 guest OS under AArch64 Hypervisor;
Allows AArch32 Secure side with AArch64 Non-secure side
AArch64 MMU Support
在ARMv8 64bit出現(xiàn)之前,我們用的都是32位尋址,每個(gè)地址單位對(duì)應(yīng)內(nèi)存一個(gè)字節(jié)單元(B),所以我們最大的尋址范圍為2^32B = 4GB,但是實(shí)際當(dāng)中,內(nèi)存設(shè)備有可能遠(yuǎn)遠(yuǎn)大于4GB內(nèi)存空間,以前是通過(guò)LPAE(大物理地址擴(kuò)展)實(shí)現(xiàn)地址的擴(kuò)展,可以支持最大2^40的地址尋址范圍,ARMv8理論上最高可以提供提供了2^64個(gè)虛擬地址,但是超過(guò)16 Exabyte (2^4 * 2^60)意義并不大,所以選擇跟x86一樣,可以使用最大支持2^48虛擬地址的尋址范圍就足夠;
ARM 32bits下會(huì)用TTBR0存儲(chǔ)User-Space行程所在的Page Table (也就是0xC0000000以下的存儲(chǔ)空間),并用TTBR1存儲(chǔ)Kernel Space所在的Page Table (也就是0xC0000000以上的存儲(chǔ)空間).

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

由于ARM 64bit Kernel分頁(yè)大小為4kb和64kb兩種,通過(guò)設(shè)置TASK_SIZE_64 (/arch/arm64/include/asm/memory.h)來(lái)設(shè)定,當(dāng)分頁(yè)大小為4KB的時(shí)候,決定TASK_SIZE_64大小的VA_BITS會(huì)等于39,也就是2^39大小的Task空間(=512GB),若分頁(yè)大小為64KB時(shí),則TASK_SIZE_64對(duì)應(yīng)的VA_BITS等于 42,也就是2^42大小的Task空間(=4TB).

同時(shí)kernel空間也根據(jù)分頁(yè)大小來(lái)劃分內(nèi)核空間,可以參考下面的圖來(lái)區(qū)分:

