- RISC-V體系結(jié)構(gòu)編程與實(shí)踐(第2版)
- 笨叔
- 3141字
- 2024-09-23 17:55:58
1.3 RISC-V寄存器
1.3.1 通用寄存器
64位/32位的RISC-V體系結(jié)構(gòu)提供32個(gè)64位/32位的整型通用寄存器,分別是x0~x31寄存器,如圖1.5所示。對(duì)于浮點(diǎn)數(shù)運(yùn)算,64位的RISC-V體系結(jié)構(gòu)也提供32個(gè)浮點(diǎn)數(shù)通用寄存器,分別是f0~f31寄存器。
RISC-V的通用寄存器通常具有別名和特殊用途,在書(shū)寫(xiě)匯編指令時(shí)可以直接使用別名。
● x0寄存器的別名為zero。寄存器的內(nèi)容全是0,可以用作源寄存器,也可以用作目標(biāo)寄存器。
● x1寄存器的別名為ra——鏈接寄存器,用于保存函數(shù)返回地址。
● x2寄存器的別名為sp——棧指針寄存器,指向棧的地址。

圖1.5 RISC-V整型通用寄存器
● x3寄存器的別名為gp——全局寄存器,用于鏈接器松弛優(yōu)化。
● x4寄存器的別名為tp——線程寄存器,通常在操作系統(tǒng)中用于保存指向進(jìn)程控制塊——task_struct數(shù)據(jù)結(jié)構(gòu)的指針。
● x5~x7以及x28~x31寄存器為臨時(shí)寄存器,它們的別名分別是t0~t6。
● x8~x9以及x18~x27寄存器的別名分別是s0~s11。如果函數(shù)調(diào)用過(guò)程中要使用這些寄存器,需要先保存到棧里。另外,s0寄存器可以用作棧幀指針(Frame Pointer,F(xiàn)P)。
● x10~x17寄存器的別名分別為a0~a7,用于在調(diào)用函數(shù)時(shí)傳遞參數(shù)和返回結(jié)果。
除用于數(shù)據(jù)運(yùn)算和存儲(chǔ)之外,通用寄存器還可以在函數(shù)調(diào)用過(guò)程中起到特殊作用。RISC-V體系結(jié)構(gòu)的函數(shù)調(diào)用規(guī)范對(duì)此有約定,詳見(jiàn)第4章。
1.3.2 系統(tǒng)寄存器
除上面介紹的通用寄存器之外,RISC-V體系結(jié)構(gòu)還定義了很多的系統(tǒng)控制和狀態(tài)寄存器(Control and Status Register,CSR),通過(guò)訪問(wèn)和設(shè)置這些系統(tǒng)寄存器可以完成對(duì)處理器不同的功能配置。
RISC-V體系結(jié)構(gòu)支持以下3類(lèi)系統(tǒng)寄存器。
● M模式的系統(tǒng)寄存器。
● S模式的系統(tǒng)寄存器。
● U模式的系統(tǒng)寄存器。
程序可以通過(guò)CSR指令(如CSRRW指令)訪問(wèn)系統(tǒng)寄存器,詳見(jiàn)3.11節(jié)。
CSR指令編碼中預(yù)留了12位編碼空間(csr[11:0])用來(lái)索引系統(tǒng)寄存器,如圖1.6所示,即指令編碼中的Bit[31:20]。

圖1.6 CSR指令編碼
RISC-V體系結(jié)構(gòu)對(duì)12位CSR編碼空間做了約定。其中,Bit[11:10]用來(lái)表示系統(tǒng)寄存器的讀寫(xiě)屬性,0b11表示只讀,其余表示可讀可寫(xiě)。Bit[9:8]表示允許訪問(wèn)該系統(tǒng)寄存器的處理器模式,0b00表示U模式,0b01表示S模式,0b10表示HS/VS模式,0b11表示M模式。剩余的位用作寄存器的索引。使用CSR地址的最高位對(duì)默認(rèn)的訪問(wèn)權(quán)限進(jìn)行編碼,簡(jiǎn)化了硬件中的錯(cuò)誤檢查流程,并提供了更大的CSR編碼空間,但限制了CSR到地址空間的映射。CSR地址空間映射如表1.3所示。
表1.3 CSR地址空間映射

注:① CSR編碼中的“X”可以是0或1。
下面的訪問(wèn)行為會(huì)觸發(fā)非法指令異常。
● 訪問(wèn)不存在或者沒(méi)有實(shí)現(xiàn)的系統(tǒng)寄存器。
● 嘗試寫(xiě)入只具有只讀屬性的系統(tǒng)寄存器。
● 在低級(jí)別的處理器模式下訪問(wèn)高級(jí)別的處理器模式的系統(tǒng)寄存器,例如,在S模式下訪問(wèn)M模式的系統(tǒng)寄存器。
1.3.3 U模式下的系統(tǒng)寄存器
U模式下的系統(tǒng)寄存器如表1.4所示。
表1.4 U模式下的系統(tǒng)寄存器

RDCYCLE偽指令讀取cycle系統(tǒng)寄存器的值,返回處理器內(nèi)核執(zhí)行的時(shí)鐘周期數(shù)。注意,它返回的是物理處理器內(nèi)核(而不是處理器硬件線程)的時(shí)鐘周期數(shù)。RDCYCLE偽指令的主要作用是進(jìn)行性能監(jiān)控和調(diào)優(yōu)。
RDTIME偽指令讀取time系統(tǒng)寄存器的值,獲取系統(tǒng)的實(shí)際時(shí)間。系統(tǒng)每次啟動(dòng)時(shí)讀取互補(bǔ)金屬-氧化物-半導(dǎo)體(Complementary Metal-Oxide-Semiconductor,CMOS)上的RTC(Real Time Clock,實(shí)時(shí)時(shí)鐘)計(jì)數(shù),時(shí)鐘中斷時(shí)更新該計(jì)數(shù)。
RDINSTRET偽指令讀取instret系統(tǒng)寄存器的值,返回處理器執(zhí)行線程已經(jīng)執(zhí)行的指令數(shù)量。
hpmcounter3~hpmcounter31為29個(gè)用于系統(tǒng)性能監(jiān)測(cè)的寄存器,這些計(jì)數(shù)器的計(jì)數(shù)記錄平臺(tái)的事件,并通過(guò)額外的特權(quán)寄存器進(jìn)行配置。
RDCYCLE、RDTIME以及RDINSTRET偽指令在某些處理器上是通過(guò)SBI固件進(jìn)行軟件模擬實(shí)現(xiàn)的。例如,在U模式下使用RDTIME偽指令會(huì)觸發(fā)非法指令異常,處理器將陷入M模式,M模式下的異常處理程序會(huì)讀取time系統(tǒng)寄存器的值,然后返回U模式。
1.3.4 S模式下的系統(tǒng)寄存器
S模式下的系統(tǒng)寄存器如表1.5所示。
表1.5 S模式下的系統(tǒng)寄存器

接下來(lái),介紹表1.5中的部分寄存器。
1.sstatus寄存器
sstatus寄存器表示S模式下的處理器狀態(tài),如圖1.7所示。

圖1.7 sstatus寄存器
圖1.7中的WPRI表示這些字段是保留的,軟件應(yīng)該忽略從這些字段讀取的值,并且在向同一寄存器的其他字段寫(xiě)入值時(shí),應(yīng)該保留這些字段中保存的值。通常,為了向前兼容,硬件會(huì)將這些字段設(shè)為只讀的零值。sstatus寄存器中其他字段的含義如表1.6所示。
表1.6 sstatus寄存器中其他字段的含義

2.sie寄存器
sie寄存器用來(lái)使能和關(guān)閉S模式下的中斷,詳見(jiàn)第8章。
3.stvec寄存器
stvec寄存器用來(lái)在S模式下配置異常向量表入口地址和異常訪問(wèn)模式,詳見(jiàn)第8章。
4.scounteren寄存器
scounteren寄存器是一個(gè)32位寄存器,用來(lái)使能U模式下的硬件性能監(jiān)測(cè)和計(jì)數(shù)寄存器,如圖1.8所示。

圖1.8 scounteren寄存器
各字段的含義如下。
● CY字段:使能U模式下的cycle系統(tǒng)寄存器。
● TM字段:使能U模式下的time系統(tǒng)寄存器。
● IR字段:使能U模式下的instret系統(tǒng)寄存器。
● HPM3~HPM31字段:使能U模式下的hpmcounter3~hpmcounter31系統(tǒng)寄存器。
5.sscratch寄存器
sscratch寄存器是一個(gè)專(zhuān)門(mén)給S模式使用的臨時(shí)寄存器,當(dāng)處理器運(yùn)行在U模式下時(shí),它用來(lái)保存S模式下的進(jìn)程控制塊(例如,BenOS中的task_struct數(shù)據(jù)結(jié)構(gòu))的指針。
在操作系統(tǒng)中,當(dāng)一個(gè)進(jìn)程從S模式返回U模式時(shí),通常使用sscratch寄存器來(lái)保存該進(jìn)程的task_struct數(shù)據(jù)結(jié)構(gòu)的指針。當(dāng)該進(jìn)程需要重新返回S模式時(shí),讀取sscratch寄存器即可得到task_struct數(shù)據(jù)結(jié)構(gòu)。有人認(rèn)為,進(jìn)程可以在U模式下調(diào)度。這是不正確的,一個(gè)進(jìn)程要調(diào)度,必須返回S模式下的調(diào)度器里(見(jiàn)17.3.8小節(jié))。
6.sepc寄存器
當(dāng)處理器陷入S模式時(shí),會(huì)把中斷現(xiàn)場(chǎng)或觸發(fā)異常時(shí)的指令對(duì)應(yīng)的虛擬地址寫(xiě)入sepc寄存器中。
7.scause寄存器
scause寄存器用于保存S模式下的異常原因,詳見(jiàn)第8章。
8.stval寄存器
當(dāng)處理器陷入S模式時(shí),stval寄存器會(huì)記錄發(fā)生異常的虛擬地址。
9.sip寄存器
sip寄存器用來(lái)表示哪些中斷處于待定(pending)狀態(tài),詳見(jiàn)第8章。
10.satp寄存器
satp寄存器用于地址轉(zhuǎn)換,詳見(jiàn)第10章。
1.3.5 M模式下的系統(tǒng)寄存器
M模式下的系統(tǒng)寄存器如表1.7所示。
表1.7 M模式下的系統(tǒng)寄存器

接下來(lái),介紹表1.7中常用的寄存器。
1.misa寄存器
misa寄存器用來(lái)表示處理器支持的指令集體系結(jié)構(gòu)和擴(kuò)展,如圖1.9所示。

圖1.9 misa寄存器
字段的含義如下。
● Extensions:表示處理器支持的擴(kuò)展,如表1.8所示。
● MXL:表示M模式下寄存器的長(zhǎng)度。
◇ 1:表示32位。
◇ 2:表示64位。
◇ 3:表示128位。
表1.8 處理器支持的擴(kuò)展

2.mvendorid寄存器
mvendorid寄存器是一個(gè)32位只讀寄存器,遵循JEDEC制造商ID規(guī)范。
3.marchid寄存器
marchid寄存器用于返回處理器體系結(jié)構(gòu)ID,該ID由RISC-V基金會(huì)統(tǒng)一分配。
4.mimpid寄存器
mimpid寄存器用于返回處理器的實(shí)現(xiàn)版本ID。
5.mhartid寄存器
mhartid寄存器用于返回處理器硬件線程ID。多核處理器中硬件線程的ID不一定是連續(xù)編號(hào)的,但至少有一個(gè)硬件線程的ID為0,同時(shí)需保證運(yùn)行環(huán)境中硬件線程的ID互不相同。
6.mstatus寄存器
mstatus寄存器表示M模式下的處理器狀態(tài),如圖1.10所示。

圖1.10 mstatus寄存器
mstatus寄存器中部分字段的含義如表1.9所示。
表1.9 mstatus寄存器中部分字段的含義

7.medeleg寄存器
medeleg寄存器用于把異常委托到S模式下處理,詳見(jiàn)第8章。
8.mideleg寄存器
mideleg寄存器用于把中斷委托到S模式下處理,詳見(jiàn)第8章。
9.mie寄存器
mie寄存器用來(lái)使能和關(guān)閉M模式下的中斷,詳見(jiàn)第8章。
10.mtval寄存器
當(dāng)處理器陷入M模式時(shí),mtval寄存器記錄發(fā)生異常的虛擬地址。
11.mcounteren寄存器
mcounteren寄存器是一個(gè)32位寄存器,用來(lái)使能S模式或者U模式下的硬件性能監(jiān)測(cè)和計(jì)數(shù)寄存器,如圖1.11所示。

圖1.11 mcounteren寄存器
字段的含義如下。
● CY字段:使能S模式或者U模式下的cycle系統(tǒng)寄存器。
● TM字段:使能S模式或者U模式下的time系統(tǒng)寄存器。
● IR字段:使能S模式或者U模式下的instret系統(tǒng)寄存器。
● HPM3~HPM31字段:使能S模式或者U模式下的hpmcounter3~hpmcounter31系統(tǒng)寄存器。
12.mscratch寄存器
mscratch寄存器是一個(gè)專(zhuān)門(mén)給M模式使用的臨時(shí)寄存器,當(dāng)處理器運(yùn)行在S模式或者U模式下時(shí),它用來(lái)保存M模式中上下文數(shù)據(jù)結(jié)構(gòu)的指針。例如,在MySBI固件中用來(lái)保存M模式下的棧指針( Stack Pointer,SP),在OpenSBI中用來(lái)保存M模式下的sbi_scratch數(shù)據(jù)結(jié)構(gòu)。
13.mepc寄存器
當(dāng)處理器陷入M模式時(shí),會(huì)將中斷或遇到異常的指令的虛擬地址寫(xiě)入mepc寄存器中。
14.mcause寄存器
mcause寄存器是M模式下的異常原因寄存器,詳見(jiàn)第8章。
15.mip寄存器
mip寄存器用來(lái)表示哪些中斷處于待定狀態(tài),詳見(jiàn)第8章。
- 現(xiàn)代C++編程:從入門(mén)到實(shí)踐
- Learning Single:page Web Application Development
- R語(yǔ)言經(jīng)典實(shí)例(原書(shū)第2版)
- Java程序員面試算法寶典
- SQL語(yǔ)言從入門(mén)到精通
- R語(yǔ)言數(shù)據(jù)可視化實(shí)戰(zhàn)
- Java游戲服務(wù)器架構(gòu)實(shí)戰(zhàn)
- C#開(kāi)發(fā)案例精粹
- 從零開(kāi)始:UI圖標(biāo)設(shè)計(jì)與制作(第3版)
- Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)與應(yīng)用
- R語(yǔ)言:邁向大數(shù)據(jù)之路(加強(qiáng)版)
- Emotional Intelligence for IT Professionals
- Go語(yǔ)言入門(mén)經(jīng)典
- Building Web and Mobile ArcGIS Server Applications with JavaScript(Second Edition)
- JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐