0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

剖析Armv8-A的AArch64寄存器

jf_78858299 ? 來源:老秦談芯 ? 作者: 老秦談芯 ? 2023-01-30 16:45 ? 次閱讀

今天來簡單研究一下Armv8-A的AArch64寄存器。

根據(jù)指令使用數(shù)據(jù)的方式, 指令系統(tǒng)可分為堆棧型、累加器型和寄存器型。寄存器型又可以進(jìn)一步分為寄存器-寄存器型和寄存器-存儲(chǔ)器型。

  • 堆棧型。堆棧型指令又稱零地址指令, 其操作數(shù)都在棧頂, 在運(yùn)算指令中不需要指定操作數(shù), 默認(rèn)對棧頂數(shù)據(jù)進(jìn)行運(yùn)算并將結(jié)果壓回棧頂。
  • 累加器型。累加器型指令又稱單地址指令, 包含一個(gè)隱含操作數(shù)——累加器, 另一個(gè)操作數(shù)在指令中指定, 結(jié)果寫回累加器中。
  • 寄存器-存儲(chǔ)器型。在這種類型的指令系統(tǒng)中, 每個(gè)操作數(shù)都由指令顯式指定, 操作數(shù)為寄存器和內(nèi)存單元。
  • 寄存器-寄存器型。在這種類型的指令系統(tǒng)中, 每個(gè)操作數(shù)也由指令顯式指定, 但除了訪存指令外的其他指令的操作數(shù)都只能是寄存器。

寄存器-寄存器型指令系統(tǒng)中,運(yùn)算指令的操作數(shù)只能來自寄存器, 不能來自存儲(chǔ)器, 所有的訪存都必須顯式的通過load和store指令來完成, 所以寄存器-寄存器型又被稱為load-store型。使用寄存器的優(yōu)勢在于, 寄存器的訪問速度快, 便于編譯器的調(diào)度優(yōu)化, 并可以充分利用局部性原理, 大量的操作可以在寄存器中完成。此外, 寄存器-寄存器型的另一個(gè)優(yōu)勢是寄存器之間的相關(guān)性容易判斷, 容易實(shí)現(xiàn)流水線、多發(fā)射和亂序執(zhí)行等方法。當(dāng)今的指令系統(tǒng)主要是寄存器-寄存器型。(以上內(nèi)容摘自《計(jì)算機(jī)體系結(jié)構(gòu)基礎(chǔ)》)

說了這么多,就是想強(qiáng)調(diào)一下在Armv8-A中寄存器的重要性。

在AArch64應(yīng)用級(jí)角度,一個(gè)PE(Process Element)具有下列寄存器:

31個(gè)通用寄存器, R0 - R30,其中64-bit的寄存器命名為X0 – X30,而32位的寄存器命名為W0 -W30。

零寄存器XZR(64-bit)和WZR(32-bit)。

一個(gè)64-bit的堆棧指針(Stack Pointer)寄存器,堆棧指針的最低有效32位可以使用寄存器WSP訪問。

一個(gè)64-bit的程序計(jì)數(shù)器(Program Counter),用于保存當(dāng)前指令地址。軟件無法直接寫入PC。

32個(gè)SIMD(Single Instruction Multiple Data)&FP(Float Point)寄存器,V0 – V31。其中,128-bit的寄存器命名為Q0 -Q31;64-bit的命名為D0 – D31;32-bit的命名為S0 – S31;16-bit的命名為H0 -H31;8-bit的命名為B0 – B31。

一個(gè)64-bit的SIMD&FP控制寄存器FPCR。

一個(gè)64-bit的SIMD&FP狀態(tài)寄存器FPSR。

三十二個(gè)可擴(kuò)展向量寄存器(Scalable Vector registers),Z0 – Z31,寄存器寬度取決于具體實(shí)現(xiàn),在128-1024 bit之間。

十六個(gè)可擴(kuò)展斷言寄存器(Scalable Predicate registers),P0 - P15。

一個(gè)專用SVE第一故障寄存器FFR(First Fault Register)。

一個(gè)處理器狀態(tài)寄存器PSTATE,它是處理器狀態(tài)信息的集合,包括條件標(biāo)記寄存器NZCV,異常屏蔽寄存器DAIF,SP選擇寄存器SPSEL、異常等級(jí)寄存器CurrentEL等。下圖是PSTATE的字段定義。

在AArch64下,PSTATE字段使用以下專用(Special-Purpose)寄存器訪問,通過MRS指令直接讀取,通過MSR指令直接寫入。

NZCV寄存器比較簡單,如下圖。N是負(fù)數(shù)條件標(biāo)志位,如果最后一個(gè)標(biāo)志設(shè)置指令的結(jié)果為負(fù),則N=1;Z是0條件標(biāo)志位,如果最后一個(gè)標(biāo)志設(shè)置指令的結(jié)果為零,則Z=1,否則Z=0;C是進(jìn)位條件標(biāo)志位,如果最后一個(gè)標(biāo)志設(shè)置指令導(dǎo)致進(jìn)位情況發(fā)生,則C=1;V是溢出條件標(biāo)志位,如果最后一個(gè)標(biāo)志設(shè)置指令導(dǎo)致溢出情況發(fā)生,則V=1。其它位是保留位。

D是處理器狀態(tài)調(diào)試屏蔽位;A是系統(tǒng)錯(cuò)誤(SError)中斷屏蔽位;I是IRQ屏蔽位;F是FIQ屏蔽位。其它位是保留位。

CurrentEL是當(dāng)前異常等級(jí)寄存器,

SPSel(Stack Pointer Select)是堆棧指針選擇寄存器,如下圖,只有一個(gè)有效位。0b0表示在所有異常級(jí)別使用SP_EL0;0b1表示在異常級(jí)別ELx使用SP_ELx。

PAN(Privileged Access Never)是特權(quán)訪問禁止寄存器。0b0表示特權(quán)讀寫不被此機(jī)制禁用;0b1表示禁用對EL0級(jí)別可訪問地址的特權(quán)讀寫訪問。

UAO(User Access Override)是用戶訪問覆蓋寄存器。

DIT(Data Independent Timing)是數(shù)據(jù)獨(dú)立時(shí)序寄存器。0b0表示該架構(gòu)沒有說明任何指令的時(shí)序?qū)傩浴?/p>

SSBS是Speculative Store Bypass Safe(翻譯不出來了)。0b0表示不允許硬件進(jìn)行推測性load/store。

TCO(Tag Check Override)是標(biāo)記檢查覆蓋寄存器。改為表示是否允許全局禁用內(nèi)存標(biāo)記檢查。0b0表示load/store不受影響;0b1表示load/store不被檢查。

ALLINT(All Interrupt Mask Bit)是全部中斷屏蔽寄存器。

AArch64的專用寄存器除了上述,還有很多其它的。

此外,AArch64中還有大量的系統(tǒng)寄存器(System Registers)。系統(tǒng)寄存器為執(zhí)行控制、狀態(tài)和一般系統(tǒng)配置提供支持。大多數(shù)系統(tǒng)寄存器在EL0異常等級(jí)時(shí)不可訪問。然而,一些系統(tǒng)寄存器可以配置為允許執(zhí)行在EL0等級(jí)的軟件進(jìn)行訪問??梢詮腅L0訪問的寄存器包括:

  • Cache ID registers
  • Debug registers
  • Performance Monitors registers
  • Activity Monitors registers
  • Thread ID registers
  • Timer registers

前面講GIC的時(shí)候提到過,ARM把一些中斷相關(guān)的寄存器從GIC中剝離出來,放到了CPU interface中。在GICv2時(shí),這些寄存器可以設(shè)計(jì)成系統(tǒng)寄存器,也可以設(shè)計(jì)成尋址訪問的寄存器,但是到了GICv3,要求這些寄存器必須是系統(tǒng)寄存器。

對于系統(tǒng)寄存器的訪問,也是通過MSR和MRS指令。

本次介紹的寄存器只是AArch64中全部寄存器的冰山一角,實(shí)際的寄存器遠(yuǎn)遠(yuǎn)多于今天提到的這些。ARM專門提供了一篇描述Armv8-A寄存器的文檔,有四千多頁。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7440

    瀏覽量

    163530
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6837

    瀏覽量

    88754
  • 累加器
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    9436
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ARMv8-A AArch32主要特性

    Cortex-A32產(chǎn)品介紹ARMv8-A AArch32主要特性ARMv7-M與AArch32的不同之處軟件從
    發(fā)表于 02-19 06:20

    ARMv8架構(gòu)資料分享

    (異常級(jí)別為 EL0 - EL3)  · ARMv8 寄存器組(和先前完全不同的 64寄存器)  · A64 指令集(新的
    發(fā)表于 03-21 14:50

    ARMv8aarch64aarch32是怎樣進(jìn)行切換的

    ARMv8中,aarch64aarch32是通過異常進(jìn)行切換的。而A32和T32是通過bx指令進(jìn)行切換的。如下圖:以下A64
    發(fā)表于 04-01 15:09

    一文讀懂ARM AArch64 state的寄存器

    AArch64 state的寄存器寄存器分為一般寄存器和特殊寄存器,另外一些寄存器在特權(quán)執(zhí)行模式
    發(fā)表于 05-09 09:37

    請問Armv8-A到底是什么東西呢

    兼容,在Armv8-A中實(shí)際應(yīng)用較少,后面內(nèi)容基本都是介紹AArch64的相關(guān)內(nèi)容。AArch64中擴(kuò)展了一些寄存器,包括以下:31個(gè)通用的64
    發(fā)表于 08-22 15:39

    簡單研究一下Armv8-AAArch64寄存器

    的指令系統(tǒng)主要是寄存器-寄存器型。說了這么多,就是想強(qiáng)調(diào)一下在Armv8-A寄存器的重要性。在AArch64應(yīng)用級(jí)角度,一個(gè)PE(Proc
    發(fā)表于 09-20 14:54

    AArch64異常模型指南

    AArch64異常模型指南介紹了Armv8-A中的異常和特權(quán)模型Armv9-A。它涵蓋了Arm體系結(jié)構(gòu)中不同類型的異常,以及處理與異常的關(guān)系。 這些內(nèi)容面向底層代碼的開發(fā)人員,例如引
    發(fā)表于 08-02 06:03

    AArch64外部調(diào)試詳解

    Armv8-A體系結(jié)構(gòu)支持自托管調(diào)試和外部調(diào)試。本指南提供了外部調(diào)試的概述,并描述了 體系結(jié)構(gòu)支持。該指南解釋了外部調(diào)試功能,以及啟用這些功能的步驟功能。 當(dāng)調(diào)試托管在處理元素(PE)上時(shí),將使
    發(fā)表于 08-02 06:37

    ARM通用中斷控制體系結(jié)構(gòu)規(guī)范GIC體系結(jié)構(gòu)版本3和版本4

    本手冊中的體系結(jié)構(gòu)描述使用了與Armv8體系結(jié)構(gòu)相同的術(shù)語。有關(guān)該術(shù)語的更多信息,請參閱Armv8-A架構(gòu)配置文件Armv8 Arm?架構(gòu)參考手冊A部分的介紹。此外,在適當(dāng)?shù)那闆r下使用
    發(fā)表于 08-11 07:45

    ARM Cortex-A系列ARMv8-A程序員指南

    ARMv8-A是針對應(yīng)用配置文件的最新一代ARM架構(gòu)。 在本書中,名稱ARMv8用于描述整個(gè)體系結(jié)構(gòu),它現(xiàn)在包括32位執(zhí)行狀態(tài)和64位執(zhí)行狀態(tài)。 ARMv8引入了使用
    發(fā)表于 08-22 07:22

    ARM公司64ARMv8-A技術(shù)授權(quán)新里程

    2014年9月4日——ARM近日宣布完成第50份64ARMv8-A的技術(shù)授權(quán)協(xié)議。隨著業(yè)界在更廣泛應(yīng)用中對于更高性能計(jì)算實(shí)現(xiàn)的需求提升,截至目前,共有27家企業(yè)取得了ARMv8-A技術(shù)授權(quán)。
    發(fā)表于 09-04 16:46 ?2084次閱讀

    ARM64與ARM32 的Linux程序區(qū)別在哪里

    arm64或ARM64。我在示例中使用了AArch64寄存器,但我所描述的許多問題也發(fā)生在ARMv8-A 32位執(zhí)行狀態(tài)。
    的頭像 發(fā)表于 08-09 09:51 ?2.7w次閱讀
    ARM<b class='flag-5'>64</b>與ARM32 的Linux程序區(qū)別在哪里

    AArch64寄存器介紹

    作為 RISC 架構(gòu),AArch64 提供了大量的通用寄存器。除通用寄存器之外,本節(jié)還會(huì)介紹特殊寄存器、系統(tǒng)控制寄存器、處理
    的頭像 發(fā)表于 08-24 09:57 ?5906次閱讀

    Armv8架構(gòu)及虛擬化介紹

    ARMv8基本概念 (1)執(zhí)行狀態(tài)(execution state):處理運(yùn)行時(shí)的環(huán)境,包括寄存器的位寬、支持的指令集、異常模型、內(nèi)存管理及編程模型等。ARMv8體系結(jié)構(gòu)定義了
    的頭像 發(fā)表于 04-16 10:45 ?6209次閱讀

    最新的Linux aarch64 LSA驅(qū)動(dòng)程序

    電子發(fā)燒友網(wǎng)站提供《最新的Linux aarch64 LSA驅(qū)動(dòng)程序.zip》資料免費(fèi)下載
    發(fā)表于 08-23 15:46 ?2次下載
    最新的Linux <b class='flag-5'>aarch64</b> LSA驅(qū)動(dòng)程序