設(shè)計(jì)網(wǎng)站公司地址深圳全網(wǎng)營(yíng)銷系統(tǒng)
本篇文章的內(nèi)容
- 一、計(jì)算機(jī)組成原理的相關(guān)知識(shí)
- 1.1 計(jì)算機(jī)的硬件組成
- 1.2 程序的存儲(chǔ)與執(zhí)行
- 1.3 程序語(yǔ)言的設(shè)計(jì)和進(jìn)化
- 1.4 存儲(chǔ)設(shè)備的層次結(jié)構(gòu)
- 1.5 操作系統(tǒng)
- 二、RISC-V的指令集ISA簡(jiǎn)介
- 2.1 什么是ISA
- 2.2 復(fù)雜指令集(CISC)和精簡(jiǎn)指令集(RISC)
- 2.3 ISA的寬度
- 2.4 RISC-V的特點(diǎn)
- 2.5 RISC-V ISA的命名規(guī)范
- 2.6 RISC-V ISA的模塊化
- 2.7 RISC-V ISA的通用寄存器
- 2.8 RISC-V的硬件線程HART
- 2.9 RISC-V的特權(quán)級(jí)別和CSR
- 2.10 內(nèi)存管理和保護(hù)
- 2.11 異常和中斷
??本系列是博主參考B站課程學(xué)習(xí)開(kāi)發(fā)一個(gè)RISC-V的操作系統(tǒng)的學(xué)習(xí)筆記,計(jì)劃從RISC-V的底層匯編指令學(xué)起,結(jié)合C語(yǔ)言,在Ubuntu 20.04上開(kāi)發(fā)一個(gè)簡(jiǎn)易的操作系統(tǒng)。一個(gè)目的是通過(guò)實(shí)踐操作學(xué)習(xí)和了解什么是操作系統(tǒng),第二個(gè)目的是為之后學(xué)習(xí)RISC-V的集成電路設(shè)計(jì)打下一定基礎(chǔ)。本系列持續(xù)不定期更新,分享出來(lái)和大家一同交流進(jìn)步。
??博主是微電子科學(xué)與工程專業(yè)的學(xué)生,對(duì)軟件和操作系統(tǒng)難免有理解不到位的地方。如有謬誤敬請(qǐng)不吝告知,不勝感激。
??參考課程及文章:
??【Bilibili】[完結(jié)] 循序漸進(jìn),學(xué)習(xí)開(kāi)發(fā)一個(gè)RISC-V上的操作系統(tǒng) - 汪辰 - 2021春
一、計(jì)算機(jī)組成原理的相關(guān)知識(shí)
1.1 計(jì)算機(jī)的硬件組成
- CPU(Central Processing Unit):中央處理單元
- CU(Control Unit):控制單元
- ALU(Arithmetic Logical Unit):算數(shù)邏輯單元
- Register x:多個(gè)寄存器
- IO Bridge:IO橋
- Main Memary:主存(內(nèi)存)
- 外設(shè)(屏幕,鍵盤,鼠標(biāo)等)
??上圖展示了兩種主流的計(jì)算機(jī)的組成架構(gòu): - 馮諾依曼架構(gòu)(Vonda Neumann architecture):又稱普林斯頓架構(gòu)(Princetion architecture),特點(diǎn)是指令和數(shù)據(jù)不加區(qū)別地存儲(chǔ)在存儲(chǔ)器中,經(jīng)由同一個(gè)總線傳輸。優(yōu)點(diǎn)是總線開(kāi)銷小,控制邏輯實(shí)現(xiàn)更簡(jiǎn)單;缺點(diǎn)是執(zhí)行效率較低。現(xiàn)在大量的PC機(jī)和服務(wù)器都是采用這種架構(gòu)設(shè)計(jì)的。之后的課程主要圍繞該架構(gòu)展開(kāi)。
- 哈佛架構(gòu)(Harvard architecture):特點(diǎn)是將程序指令和數(shù)據(jù)分開(kāi)存儲(chǔ)。優(yōu)點(diǎn)是執(zhí)行效率較高,缺點(diǎn)是總線開(kāi)銷更大,控制邏輯實(shí)現(xiàn)更復(fù)雜。小型的微控制器傾向于使用該種架構(gòu)。
1.2 程序的存儲(chǔ)與執(zhí)行
??想要在計(jì)算機(jī)上運(yùn)行程序,我們首先要將編輯好的程序進(jìn)行編譯和鏈接,將其存儲(chǔ)在硬盤(Disk)中,通過(guò)硬盤的控制器(Disc Controller)將編譯后的機(jī)器指令a.out
文件存儲(chǔ)到內(nèi)存中,CPU通過(guò)IO橋不斷依次進(jìn)行取指(Fetch)、譯碼(Decode)、執(zhí)行(Excute),此時(shí)我們才說(shuō)計(jì)算機(jī)正在運(yùn)行我們的程序。取指是將機(jī)器指令取到對(duì)應(yīng)的寄存器中。晶振是外部的程序推動(dòng)者,不斷驅(qū)動(dòng)處理器進(jìn)行上述過(guò)程。
1.3 程序語(yǔ)言的設(shè)計(jì)和進(jìn)化
??假設(shè)現(xiàn)有一個(gè)只能執(zhí)行加法操作的8位計(jì)算機(jī),我們通過(guò)對(duì)加法過(guò)程進(jìn)行分析(如上圖所示),發(fā)現(xiàn)執(zhí)行加法操作只需要從內(nèi)存中取數(shù)據(jù)(LOAD)、執(zhí)行加法操作(ADD)、存儲(chǔ)數(shù)據(jù)到內(nèi)存(STORE) 三步操作。我們對(duì)不同的操作進(jìn)行編碼,設(shè)計(jì)不同的指令編碼格式。假設(shè)采用馮諾依曼架構(gòu),即操作指令和數(shù)據(jù)都存儲(chǔ)在同一塊內(nèi)存中,那么計(jì)算機(jī)執(zhí)行該程序前內(nèi)存的存儲(chǔ)內(nèi)容如下圖所示(內(nèi)存中黃色的是指令,綠色的是數(shù)據(jù)):
1.4 存儲(chǔ)設(shè)備的層次結(jié)構(gòu)
1.5 操作系統(tǒng)
??如上圖所示,操作系統(tǒng)是介于底層硬件和應(yīng)用程序之間的結(jié)構(gòu),它通過(guò)兩個(gè)接口分別和上下兩層相連。操作系統(tǒng)和應(yīng)用程序之間的接口稱為系統(tǒng)調(diào)用(System Call),操作系統(tǒng)和底層硬件之間的接口稱為指令集架構(gòu)(ISA)。操作系統(tǒng)主要的作用主要可以歸結(jié)為以下兩點(diǎn):
- 保護(hù)硬件被失控的軟件應(yīng)用程序?yàn)E用
- 向應(yīng)用程序提供簡(jiǎn)單一致的抽象接口來(lái)控制復(fù)雜的多種外設(shè)硬件。
二、RISC-V的指令集ISA簡(jiǎn)介
2.1 什么是ISA
??ISA(Instruction Set Architecture),指令集架構(gòu),是底層硬件電路面向上層軟件程序提供的一層接口規(guī)范。ISA不單單指一種匯編語(yǔ)言,它定義的內(nèi)容比匯編語(yǔ)言更加廣泛。ISA定義了:
- 基本數(shù)據(jù)類型(BYTE/HALFWORD/WORD/…)
- 寄存器(Register)的種類和名稱
- 指令
- 尋址模式
- 異常和中斷的處理方式
- …
??ISA為上層軟件提供一層抽象,制定規(guī)則和約束,讓編程者不用操心具體的電路結(jié)構(gòu)。IBM 360 是第一個(gè)將 ISA 與硬件實(shí)現(xiàn)分離的計(jì)算機(jī)。
2.2 復(fù)雜指令集(CISC)和精簡(jiǎn)指令集(RISC)
??CISC復(fù)雜指令集(Complex Instruction Set Computing),針對(duì)特定的功能實(shí)現(xiàn)特定的指令,導(dǎo)致指令數(shù)目比較多,但生成的程序長(zhǎng)度相對(duì)較短。一般而言,使用復(fù)雜指令集開(kāi)發(fā)的CPU指令的種類很多,對(duì)于每一種操作都有一種特定的指令。就像在中國(guó)古代,文字寫(xiě)在竹簡(jiǎn)或布匹。為了表達(dá)更多的信息,考慮到成本問(wèn)題,一個(gè)文字表達(dá)的含義被極大地豐富起來(lái)。典型的復(fù)雜指令集有x86等。
??RISC精簡(jiǎn)指令集(Reduced Instruction Set Computing)只定義常用指令,對(duì)復(fù)雜的功能采用常用指令組合實(shí)現(xiàn),這導(dǎo)致指令數(shù)目比較精簡(jiǎn),但生成的程序長(zhǎng)度相對(duì)較長(zhǎng)。精簡(jiǎn)指令集就像現(xiàn)代的白話文,當(dāng)人們不再考慮寫(xiě)字帶來(lái)的成本時(shí),表達(dá)相同的意思,人們就不再“惜字如金”,用簡(jiǎn)單、易讀、易理解的方式來(lái)表達(dá)信息。典型的簡(jiǎn)單指令集有SPARC、Power、ARM、MIPS、RISC-V等。
??現(xiàn)如今,RISC 和 CISC 也逐漸有相互融合的趨勢(shì)。Intel最早采用復(fù)雜指令集,現(xiàn)如今也在逐漸向精簡(jiǎn)指令集靠近。
2.3 ISA的寬度
??ISA (處理器)的寬度指的是 CPU 中通用寄存器的寬度(二進(jìn)制的位數(shù)),實(shí)際上就是CPU處理器的字長(zhǎng),這決定了尋址范圍的大小、以及數(shù)據(jù)運(yùn)算的能力。
??注意:ISA 的寬度和指令編碼長(zhǎng)度無(wú)關(guān)。
2.4 RISC-V的特點(diǎn)
- 簡(jiǎn)單:相較于x86,RISC-V的指令很少,相關(guān)的技術(shù)手冊(cè)也較少。
- 清晰的分層設(shè)計(jì)
- 模塊化:擁有核心指令集和擴(kuò)展指令集。
- 穩(wěn)定:總結(jié)了前人的經(jīng)驗(yàn)。
- 社區(qū)化:開(kāi)源,自由,公開(kāi)。
2.5 RISC-V ISA的命名規(guī)范
- ISA 命名格式:RV[###][abc……xyz]
- RV:用于標(biāo)識(shí) RISC-V 體系架構(gòu)的前綴,即 RISC-V的縮寫(xiě)。
- [###]:{32, 64, 128} 用于標(biāo)識(shí)處理器的字寬,也就是處理器的通用寄存器的寬度(單位為 bit)。
- [abc…xyz]:標(biāo)識(shí)該處理器支持的指令集模塊集合。不同的字母代表了不同的指令集模塊。
??例子:RV32IMA,表示該32位處理器使用RISC-V的I、M、A指令模塊,RV64GC同理。
2.6 RISC-V ISA的模塊化
??對(duì)于ISA而言,其有兩種發(fā)展方式,分別是增量化和模塊化。
??增量化 ISA: 計(jì)算機(jī)體系結(jié)構(gòu)的傳統(tǒng)方法,同一個(gè)體系架構(gòu)下的新一代處理器不僅實(shí)現(xiàn)了新的 ISA 擴(kuò)展,還必須實(shí)現(xiàn)過(guò)去的所有擴(kuò)展,目的是為了保持向后的二進(jìn)制兼容性。典型的,以 80x86 為代表。
??模塊化 ISA: 由 1 個(gè)基本整數(shù)指令集 + 多個(gè)可選的擴(kuò)展指令集組成?;A(chǔ)指令集是固定的,永遠(yuǎn)不會(huì)改變。擴(kuò)展指令集類似一種插件的思想。
??RISC-V的ISA中的基本整數(shù)指令集(Integer)是唯一強(qiáng)制要求實(shí)現(xiàn)的基礎(chǔ)指令集,其他指令集都是可選的擴(kuò)展模塊。其中嵌入式指令集(Embedded)是基本整數(shù)指令集的子集,在一些小型的嵌入式場(chǎng)景中適用。高字長(zhǎng)的基本整數(shù)指令集向下兼容,如下表所示:
擴(kuò)展模塊指令集:
- RISC-V 允許在實(shí)現(xiàn)中以可選的形式實(shí)現(xiàn)其他標(biāo)準(zhǔn)化和非標(biāo)準(zhǔn)化的指令集擴(kuò)展。
- 特定組合“IMAFD”被稱為 “通用(General)”組合,用英文字母 G 表示。
2.7 RISC-V ISA的通用寄存器
??RISC-V 的非特權(quán)規(guī)范(Unprivileged Specification)定義了 32 個(gè)通用寄存器以及一個(gè) PC(程序計(jì)數(shù))寄存器。這種結(jié)構(gòu)對(duì) RV32I/RV64I/RV128I 都是相同的。如果實(shí)現(xiàn)支持 F/D 擴(kuò)展則需要額外支持 32個(gè) 浮點(diǎn)(Float Point)寄存器。RV32E 將 32 個(gè)通用寄存器縮減為 16 個(gè)。
??寄存器的寬度由 ISA 指定,RV32 的寄存器寬度為 32 位,RV64 的寄存器寬度為 64 位,依次類推。
??每個(gè)寄存器具體編程時(shí)有特定的用途以及各自的別名。由 RISC-V Application Binary Interface (ABI) 定義。
2.8 RISC-V的硬件線程HART
??HART = Hardware Thread。早期的CPU中,一般只有一個(gè)CU(Control Unit),所以在任何時(shí)刻,只有一條硬件流被執(zhí)行。如今Intel的CPU中一般有多個(gè)核,一個(gè)核可以有兩個(gè)硬件流,這就容易引起線程混淆的問(wèn)題。通過(guò)HART可以很好地區(qū)分兩個(gè)不同的指令線程,可以將一個(gè)HART想象成一個(gè)獨(dú)立的CPU。在規(guī)范手冊(cè)中HART的概念頻頻出現(xiàn),而處理器CPU的概念卻不怎么出現(xiàn)。下面的話摘自RISC-V的官方手冊(cè):
??從軟件編程的角度來(lái)說(shuō),一個(gè)HART就是一個(gè)可以在執(zhí)行環(huán)境中自主地,獨(dú)立地,不受干擾地取指令和執(zhí)行指令的資源。
2.9 RISC-V的特權(quán)級(jí)別和CSR
??為了實(shí)現(xiàn)分級(jí)保護(hù)的功能,RISC-V 的 Privileged Specification 定義了三個(gè)特權(quán)級(jí)別(privilege level),在CPU內(nèi)部要求有一個(gè)類似多級(jí)開(kāi)關(guān)的結(jié)構(gòu),對(duì)應(yīng)三種特權(quán)級(jí)別。如下表所示:
??Machine級(jí)別是最高的級(jí)別,所有的實(shí)現(xiàn)都需要支持。RISC-V的CPU上電之后自動(dòng)運(yùn)行在Machine(機(jī)械)態(tài),此時(shí)CPU中操作的地址是真實(shí)的物理地址。通過(guò)特定的操作進(jìn)入Supervisor(管理者)態(tài)之后,此時(shí)訪問(wèn)的地址就是虛擬地址,對(duì)真實(shí)的物理地址起到了保護(hù)的作用。此外,RISC-V還提供了可選的Debug級(jí)別:
??CPU中有控制和狀態(tài)寄存器(CSR,Control and Status Register),CPU在不同的工作模式下使用不同的獨(dú)立的CSR,用于控制和獲取相應(yīng)Level下處理器的工作狀態(tài)。這些寄存器在不同的工作模式下是不能互相訪問(wèn)的。通過(guò)這種設(shè)計(jì),才能真正實(shí)現(xiàn)分級(jí)保護(hù)的目的。
??高級(jí)別的特權(quán)級(jí)別下可以訪問(wèn)低級(jí)別的 CSR,譬如 Machine Level 下可以訪問(wèn)Supervisor/User Level 的 CSR,以此類推,但反之不可以。
??RISC-V 定義了專門用于操作 CSR 的指令(“Zicsr”擴(kuò)展)。
??RISC-V 定義了特定的指令可以用于在不同特權(quán)級(jí)別之間進(jìn)行切換(ECALL/EBREAK)
2.10 內(nèi)存管理和保護(hù)
??物理內(nèi)存保護(hù)(Physical Memory Protection,PMP),它是一種較為低級(jí)的內(nèi)存管理和保護(hù)方式,在一定程度上可以保護(hù)內(nèi)存。
- 允許 M 模式指定 U 模式可以訪問(wèn)的內(nèi)存地址。
- 支持 R(讀)/W(寫(xiě))/X(執(zhí)行),以及 Lock(鎖定,不再使用),對(duì)特定的內(nèi)存區(qū)域的權(quán)限進(jìn)行規(guī)定。
??虛擬內(nèi)存(Virtual Memory),程序訪問(wèn)的地址不再是實(shí)際的物理地址,而是虛擬地址。通過(guò)特定的硬件外設(shè)MMU(Memory Management Uint,內(nèi)存管理單元)可以將虛擬地址映射到物理地址上。
- 需要支持 Supervisor Level(管理者模式)
- 用于實(shí)現(xiàn)高級(jí)的操作系統(tǒng)特性(Unix/Linux)
- 多種映射方式 Sv32/Sv39/Sv4
2.11 異常和中斷
??異常(Exception):在當(dāng)前RISC-V HART中與指令相關(guān)的運(yùn)行時(shí)發(fā)生的一種異常情況,例如除零異常。發(fā)生異常后執(zhí)行異常處理程序(由程序員自行編寫(xiě)),執(zhí)行過(guò)后回到發(fā)生異常的地方再次執(zhí)行。再次執(zhí)行相當(dāng)于程序?qū)Ξ惓V噶畹挠忠淮螄L試。
??中斷(Interrupt):可能導(dǎo)致RISC-V HART經(jīng)歷意想不到的控制轉(zhuǎn)移的外部異步事件,發(fā)生中斷后,CPU會(huì)先執(zhí)行完當(dāng)前的指令,之后再執(zhí)行中斷服務(wù)程序,返回時(shí)執(zhí)行發(fā)生中斷的指令的下一條指令繼續(xù)執(zhí)行。
??原創(chuàng)筆記,碼字不易,歡迎點(diǎn)贊,收藏~ 如有謬誤敬請(qǐng)?jiān)谠u(píng)論區(qū)不吝告知,感激不盡!博主將持續(xù)更新有關(guān)嵌入式開(kāi)發(fā)、機(jī)器學(xué)習(xí)方面的學(xué)習(xí)筆記。