一、定義:
cpu ,全稱為**處理器單元,簡稱為處理器,是乙個不算年輕的概念 早在 20 世紀60 年代便己誕生了第一款 cpu請注意區分「處理器」和「處理器核」「 pu 」和「core 」的概念。嚴格來說 「處理器核」和「 core 」是指處理器內部最核心的部分,是真正的處理器核心;而「處理器」和「cpu"往往是乙個完整的 soc ,包含了處理器核心和其他的裝置或者儲存器 但是在現實中大多數往往不會嚴格地遵循兩者的差別,時常混用,因此讀者需要根據上下文自行顫別體會具體的含義經過幾十年的發展,到 天已 相繼誕生或消亡過了幾十種不同的 cpu 架構 1-1為近幾十年來知名 cpu 架構的誕生時間表 什麼是 cpu 架構?下面讓我們來**區分 cpu的主要標準 cpu 靈魂一一指令集架構 clnstructio set architecture, isa )。
risc-v(讀音「risk-five」)是乙個新的指令集體系結構(isa),它最初用於支援計算機體系結構研究和教學,但現在我們希望它也成為乙個對於工業實現來說標準、免費、開放的體系結構。risc-v isa 被定義為乙個基本的整數 isa,必須在任何實現中存在,另外可以包含基於基本 isa 的其他擴充套件。這個基本的整數 isa 與早期的 risc 處理器非常相似,除了沒有分支延遲槽(delay slot),另外支援可選的變長指令編碼。這個基本核心被小心地限制具有最少的指令,足夠支援乙個合理的目標機,以便編譯器、彙編器、鏈結器、作業系統(包含額外的管理員級操作)可以在之上執行,這樣就可以提供乙個方便的 isa 和軟體工具鏈「骨架」,圍繞它可以構建更為定製化的處理器 isa。每乙個基本整數指令集,被整數暫存器寬度和相應的使用者位址空間大小進行分類。有兩種主要的基本整數變種,rv32i 和 rv64i,分別提供了 32 位和 64 位使用者級位址空間。硬體實現和作業系統可以提供給使用者程式使用 rv32i 或者 rv64i中的一種或者兩種。還描述了未來支援 128 位使用者位址空間的 rv128i 變種基本整數指令集。
二、指令集
基本 risc-v isa 具有 32 位固定長度指令,並且必須在 32 位邊界對齊。然而,標準 risc-v編碼模式被設計成支援變長指令的擴充套件,在這個擴充套件中,每條指令長度可以是 16 位指令包裹(parcel)長度的整數倍,並且這些指令包裹必須在 16 位邊界對齊。第 14 章中描述的標準壓縮 isa 擴充套件,通過提供壓縮的 16 位指令,減少了**大小,並放鬆了對齊要求,允許所有指令(16 位和 32 位)對齊到任意 16 位邊界,以提高**密度。圖 1.1 展示了標準 risc-v 指令長度編碼約定。所有基本 isa 中的 32 位指令的最低 2 位被設定為 11。可選的壓縮 16 位指令集擴充套件中的指令,最低 2 位被設定為 00、01 或者 10。超過 32 位的標準指令集擴充套件,在低位有額外的位被設定為 1,48 位、64 位長度約定如圖 1.1所示。指令長度在 80 位到 176 位之間的長度資訊,被編碼到乙個 3 位的字段[14:12]中,給出了 16 位字的數量,加上最開始的 5×16 位字。位[14:12]編碼為 111,保留給未來更長的指令編碼。
三、32 位指令集
1、立即數編碼變種
1)addi將符號擴充套件的12位立即數加到暫存器rs1上。算術溢位被忽略,而結果就是運算結果的低xlen位。addi rd,rs1,0用於實現mv rd,rs1組合語言偽指令。slti(set less than immediate)將數值1放到暫存器rd中,如果暫存器rs1小於符號擴充套件的立即數(比較時,兩者都作為有符號數),否則將0寫入rd。sltiu與之相似,但是將兩者作為無符號數進行比較(也就是說,立即數被首先符號擴充套件為xlen位,然後被作為乙個無符號數)。注意,sltiu rd,rs1,1將設定rd為1,如果rs1等於0,否則將rd設定為0(組合語言偽指令seqz rd,rs)。andi、ori、xori是邏輯操作,在暫存器rs1和符號擴充套件的12位立即數上執行按位and、or、xor操作,並把結果寫入rd。注意,xori rd,rs1,-1在rs1上執行乙個按位取反操作(組合語言偽指令not rd,rs)。
2)被移位常數次,被編碼為i類格式的特例。被移位的運算元放在rs1中,移位的次數被編碼到i立即數字段的低5位。右移型別被編碼到i立即數的一位高位。slli是邏輯左移(0被移入低位);srli是邏輯右移(0被移入高位);srai是算術右移(原來的符號位被複製到空出的高位中)。
3)lui(load upper immediate)用於構建32位常數,並使用u類格式。lui將u立即數放到目標暫存器rd的高20位,將rd的低12位填0。auipc(add upper immediate to pc)用於構建pc相對位址,並使用u類格式。auipc從20位u立即數構建乙個32位偏移量,將其低12位填0,然後將這個偏移量加到pc上,最後將結果寫入暫存器rd。
2、控制轉移指令
1)無條件跳轉
跳轉並連線(jal)指令使用了uj類格式,此處j立即數編碼了乙個2的倍數的有符號偏移量。這個偏移量被符號擴充套件,加到pc上,形成跳轉目標位址,跳轉範圍因此達到±1mb。jal將跳轉指令後面指令的位址(pc+4)儲存到暫存器rd中。標準軟體呼叫約定使用x1來作為返回位址暫存器。普通的無條件跳轉指令(組合語言偽指令j)被編碼為rd=x0的jal指令
2)間接跳轉指令jalr(jump and link register)使用i類編碼。通過將12位有符號i類立即數加上rs1,然後將結果的最低位設定為0,作為目標位址。跳轉指令後面指令的位址(pc+4)儲存到暫存器rd中。如果不需要結果,則可以把x0作為目標暫存器。
3)條件分支
分支指令比較兩個暫存器。beq和bne將跳轉,如果rs1和rs2相等或者不相等。blt和bltu將跳轉,如果rs1小於rs2,分別使用有符號數和無符號數進行比較。bge和bgeu將跳轉,如果rs1大於等於rs2,分別使用有符號數和無符號數進行比較。注意,bgt、bgtu、ble和bleu可以通過將blt、bltu、bge、bgeu的運算元對調來實現。
3、load 和 store 指令
rv32i是乙個load-store體系結構,也就是說,只有load和store指令可以訪問儲存器,而算術指令只在cpu暫存器上進行操作運算。rv32i提供了乙個32位使用者位址空間,它是位元組定址並且是小端的。執行環境將定義這個位址空間的哪些部分是可以合法訪問的(譯者注:這涉及到儲存保護等)。
load和store指令在暫存器和儲存器之間傳輸數值。load指令編碼為i類格式,而store指令編碼為s類格式。有效位元組位址是通過將暫存器rs1與符號擴充套件的12位偏移量相加而獲得的。load指令將儲存器中的乙個值複製到暫存器rd中。store指令將暫存器rs2中的值複製到儲存器中。lw指令將乙個32位數值從儲存器複製到rd中。lh指令從儲存器中讀取乙個16位數值,然後將其進行符號擴充套件到32位,再儲存到rd中。lhu指令儲存器中讀取乙個16位數值,然後將其進行零擴充套件到32位,再儲存到rd中。對於8位數值,lb和lbu指令的定義與前面類似。sw、sh、sb指令分別將從rs2低位開始的32位、16位、8位數值儲存到儲存器中。
4、整數暫存器-暫存器操作
add和sub分別執行加法和減法。溢位被忽略,並且結果的低xlen位被寫入目標暫存器rd。slt和sltu分別執行符號數和無符號數的比較,如果rs1
附錄
podia/podia),無需版權。
ARM危險 蘋果看上RISC V架構了
蘋果研發的晶元早已名聲在外程式設計客棧,甚程式設計客棧至已經成為iphone ipad甚至mac電腦的獨家賣點。以a系列處理器為例,從第一代a4開始到最新的a14,都是arm指令集體系下的產物。不過,隨著cpu架構第三極 力量risc v的崛起,蘋果似乎也要打造備胎 了。本週,蘋果官網的招聘啟事顯示...
幾種CPU架構
cpu架構 architecture 結構 架構,這個詞用於 cpu 的時候是指 cpu 接受和處理訊號的方式 及其內部元件的組織方式。cpu架構 從大的層面分兩類 cisc risc x86 cisc就是複雜指令集計算機,目前專指 x86 和 x86 64 兩類 其中 x86 又叫 ia32,即 ...
如何基於CPU的架構來優化軟體的效能?
一直想弄乙個從各種角度優化軟體的總結,先寫乙個從cpu架構角度的。cpu還有個特性就是有l1 l2分段快取,對於分段快取我們盡量讓他們都利用好,不要因為部分資料的需求刷裡面的內容,比如二維陣列的縱向變例會比橫向遍歷糟糕很多,因為橫向遍歷會保證cache中資料的連續性,縱向遍歷就要頻繁的重新整理cac...