|
ARMv8是ARM版本升級以來最大的一次改變,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 – Unbanked Registers: 左邊的通用寄存器用于:32位或者64位的整數(shù)運算或者64位的尋址,右邊的用于浮點運算; AArch64 Banked Registers: AArch64不在根據(jù)之前通過不同模式來區(qū)別banked寄存器,而是通過exception level; 下圖為AArch32和AArch64通用寄存器對應(yīng)關(guān)系:
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切換通過exception的方式轉(zhuǎn)換,有如下exceptions:
而高level向低level則通過ERET指令;
AArch32 and AArch64之間切換 AArch32和AArch64之間的切換只能通過發(fā)生異?;蛘呦到y(tǒng)Reset來實現(xiàn),A32 -> T32之間是通過BX指令切換的; 不同level之間的組合: AArch32 /AArch64 relationship:
在ARMv8 64bit出現(xiàn)之前,我們用的都是32位尋址,每個地址單位對應(yīng)內(nèi)存一個字節(jié)單元(B),所以我們最大的尋址范圍為2^32B = 4GB,但是實際當(dāng)中,內(nèi)存設(shè)備有可能遠(yuǎn)遠(yuǎn)大于4GB內(nèi)存空間,以前是通過LPAE(大物理地址擴(kuò)展)實現(xiàn)地址的擴(kuò)展,可以支持最大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架構(gòu)下,會通過EL1的TTBR0 (ttbr0_el1, in /arch/arm64/mm/proc).存儲User-Space行程所在的Page Table,與EL1的TTBR1存儲Kernel Space所在的Page Table,并會依據(jù)Page Size與32/64bits行程而有不同的存儲空間配置. 參考如下圖所示: 由于ARM 64bit Kernel分頁大小為4kb和64kb兩種,通過設(shè)置TASK_SIZE_64 (/arch/arm64/include/asm/memory.h)來設(shè)定,當(dāng)分頁大小為4KB的時候,決定TASK_SIZE_64大小的VA_BITS會等于39,也就是2^39大小的Task空間(=512GB),若分頁大小為64KB時,則TASK_SIZE_64對應(yīng)的VA_BITS等于 42,也就是2^42大小的Task空間(=4TB).
同時kernel空間也根據(jù)分頁大小來劃分內(nèi)核空間,可以參考下面的圖來區(qū)分: |
|
|