处理器基础-要点与实例
0. 引言
本文著力解決如下問題:
- 講體系結構的教材[1],著重于體系結構的理論,沒有實例參考;講實現的教材[2],只有實現細節,沒有背后思想。
- 兩種教材都沒有從應用來,再到應用中去。
- 多數讀者需要的是理清楚理念,基于此掌控已有IP,或者進行設計實踐和創新,并指導應用。
- 計算機體系結構有著豐富的內容,并且涉及到諸多因素,但是理清楚脈絡則綱舉目張。
- 理清楚基本結構有助于拓展理解工具鏈、應用,有助于開發當下針對AI的流處理器。
?
本文脈絡:
- 先給出應用和處理器的基本結構。
- 接下來分析應用需求,明確體系結構需要處理的相關問題,并以此探討體系結構和指令集的思想。
- 以MIPS和ARM為例,實現基本指令集,并初步探討擴展問題。
- 回歸到應用,探討體系結構如何解決應用問題,以及對于軟件編程的啟示。
1. 基本應用和處理器結構
1.1 基本處理器結構模型:
注解:
- 典型的處理器由存儲、數據路徑、控制路徑三部分組成
- 存儲部分可以進一步擴展為SRAM/Cache/加速器/IO等,代表系統的輸入輸出
- 處理和運算部分可以擴展處理器功能如特權模式,也可以擴展處理能力如SIMD/VLIW/MIMD/SP
- 系統按照馮諾依曼存儲程序計算機理念運行,一般經過取指、譯碼、執行、寫回幾個階段,實際設計和應用會略有不同
1.2 基本應用程序的例子
int * i_mem, i_buf, o_mem, o_buf;
int log2(int i)
{}
interrput 2 exception_handler()
{
}
main()
{
??? sys_init();
??????? while(1)??
??????? {?? // --- init
???????????????? int sum = 0;????????????????
???????????????? // --- input
???????????????? if(i_rdy)
???????????????????????? i_mem = i_buf;
???????????????? // --- processing
???????????????? for(i=0; i<len; i++)? {
???????????????? ??? sum = sum + i_mem;???????????????????????
???????????????? }
???????????????? o_mem = log2(sum)????????????????
???????????????? // --- output
???????????????? if(o_rdy)
???????????????????????? o_buf = o_mem;? }
}
注解:
- 程序包含系統初始化、主業務流、異常處理三部分
- 主業務流按照輸入-處理-輸出的流程運轉
- 處理部分針對一定數據類型(不同長度、有無符號、精度,可以在指令及操作碼中體現,也可以加硬件標記?)進行處理(算數、邏輯、移位),對應處理器結構模型的ALU部分。實際的應用任務經過便一起處理形成指令,處理不能直接支持的指令如大數運算也會由編譯器組合使用指令實現。具體應用很可能擴展如浮點、十進制、字符串、圖形操作、超越函數、ARM CLZ/test指令。
- 馮諾依曼計算機按指令逐條進行,同時有循環、分支(循環中也有分支判斷),分支會產生指令地址跳轉。結構化程序的函數調用是一種特殊的跳轉(。中斷是另一種特殊的跳轉(保存中斷前下一條指令地址和相關寄存器狀態,以便中斷返回)。相關的指令運行由處理器結構模型的控制路徑根據數據處理路徑的狀態實現。具體應用可能會擴展系統調用、自陷等指令。
- 數據與ALU之間的傳輸通過寄存器實現,寄存器也用于保存計算和處理器運轉的狀態。一個特殊情況是立即數,其作為指令的一部分傳遞到數據處理路徑,但是受限于指令的長度需要附加額外處理。具體應用可能會擴展虛擬存儲管理等指令。
2. 指令集和架構設計的基本問題和處理方法
應用明確之后可以開展指令集和架構設計,基本問題和處理方法可參考文獻[2]。
主要問題有兩個:存儲和尋址,指令集編碼
2.1 存儲和尋址
按照存儲方式,CPU大約可以分成堆棧型(Java虛擬機ByteCode)、累加器型(英特爾處理器和51單片機)、寄存器型(當下多數處理器屬于此類)。前者指令長度短,后者代碼高效(寄存器比存儲器快,而且尋址所需位數較少)。
寄存器型存儲方式又分為寄存器-寄存器型、存儲器-寄存器型、存儲器-存儲器型,前者較為普遍,一般都有專門的指令用于數據加載和存儲。一般有運算、參數傳遞、系統專用等幾類寄存器。
相應的,尋址方式有立即數、寄存器、直接地址、寄存器間接尋址、偏移尋址(多用于if跳轉,跳轉目標地址編譯器計算并寫進機器程序)。其中立即數尋址和偏移尋址使用頻率最高,注意立即數大小和偏移量大小都會影響指令;特殊一點的還有寄存尋址的變種如索引尋址、自增自減尋址、縮放尋址。尋址方式越復雜指令效率越高但是志玲越復雜(RIXC VS CISC)。
2.2 指令集設計與編碼
一般有CISC和RISC兩大類。
前者針對具體應用或者高級語言特性增強指令,指令功能強大、邏輯設計復雜。早期英特爾處理器屬于此種體制,但后來的宏觀是CISC微觀還是編譯成多條RISC。
RISC基于80%時間運行的常見指令,設計規整,但是編譯難度大。
指令集設計考慮的因素:
- 尋址方式,以及支持的尋址空間和寄存器個數。
- 指令長度
- 容易處理
- 留有冗余,以便后續升級保持部分前向兼容,即許多指令集宣稱的多元未飽和。
3. 典型指令集
3.1 MIPS基本指令集[2]
MIPS整數運算為三操作數,對應三類寄存器rsrc/rtmp/rdst。通用寄存器32個,每個操作數都可以用段可以使用5bit選擇。實際32個寄存器使用的時候有所分工:
?
指令集編碼:
?
注解:
- 一般來看,31:26為操作碼,25:0為操作數。長操作數指令如立即數運算、帶偏移的加載和跳轉用15:0;不同的操作其操作碼在31:26體現。非長操作數指令,31:26為0,具體操作碼利用了5:0。
- 特別地,lui對立即數左移16位賦值給rtmp;幾何ori可以對任意寄存器賦值,實現立即數
微架構:
?
注解:
3.2 ARM v4指令集
寄存器組織:
?
?
注解:
- 16個編號,不同模式下訪問互有備份以加速切換,共37個
- 通用寄存器使用遵循ATPCS規則:r0~r4用于函數調用傳遞參數(內嵌匯編編程要遵守,超過的要使用堆棧故指針編程更有效),r4~r7用于保留中間變量。
- CPSR由數據通路到控制通路,控制運轉
指令編碼表?
3.3 RISC-V指令集
?
中國指令集?
方法:
統計、時序和周期分析
例子:
大數加法
Printf
循環展開
For/if順序
增加多寄存器加載指令,MAC指令
按位取反
操作系統對于處理器的支持?
函數參數是大的結構體可以使用指針,
ARM和MIPS都有16/32兼容和切換?
參考
[1] 計算機體系結構,張晨曦
[2] 計算機原理與設計——Verilog HDL版,李亞民
[3] ARM體系結構與編程,杜春雷譯
[4] risc-v 指令集手冊
總結
以上是生活随笔為你收集整理的处理器基础-要点与实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10 蓝牙耳机配对成功,但无法连接
- 下一篇: 关于CCRC信息安全服务资质认证概念