MIPS即Million Instructions Per Second(每秒百萬條指令)的簡稱,衡量計算機性能的指�(biāo)之一,一種采取精簡指令集�處理�架構(gòu)。MIPS是高�精簡指令集計算機(RISC)體系�(jié)�(gòu)中雅的一��
MIPS技�(shù)公司是一家設(shè)計制造高性能、次及嵌入式32位和64位處理器的廠商,在RISC處理器方面占有重要地��1984年,MIPS計算機公司成��1992�,SGI收購了MIPS計算機公��1998年,MIPS脫離SGI,成為MIPS技�(shù)公司�
MIPS公司�(shè)計RISC處理器始于二十世紀(jì)八十年代��1986年推出R2000處理��1988年推R3000處理器,1991年推出款64位商用微處器R4000.之后又陸�(xù)推出R8000(于1994年)、R10000(于1996年)和R12000(于1997年)等型號�
隨后,MIPS公司的戰(zhàn)略發(fā)生變化,把重點放在嵌入式系統(tǒng)�1999�,MIPS公司�(fā)布MIPS32和MIPS64架構(gòu)�(biāo)�(zhǔn),為未來MIPS處理器的開發(fā)奠定了基�(chǔ)。新的架�(gòu)集成了所有原來MIPS指令�,并且增加了許多更強大的功能。MIPS公司陸續(xù)開發(fā)了高性能、低功耗的32位處理器�(nèi)核(core)MIPS32 4Kc與高性能64位處理器�(nèi)核MIPS64 5Kc.2000�,MIPS公司�(fā)布了針對MIPS32 4Kc的版本以�64位MIPS64 20Kc處理器內(nèi)核�
MIPS體系�(jié)�(gòu)首先是一種RISC架構(gòu)1 MIPS32架構(gòu)中有32個通用寄存�,其�$0(無論你怎么�(shè)�,這個寄存器中保存的�(shù)�(jù)都是0)和$31(保存函�(shù)�(diào)用jal的返回地址)有著特殊的用�,其它的寄存器可作為通用寄存器用于任何一條指令中�
雖然硬件沒有強制性的指定寄存器使用規(guī)�,在實際使用�,這些寄存器的用法都遵循一系列約定。這些約定與硬件確實無�(guān),但如果你想使用別人的代�,編譯器和操作系�(tǒng),你是遵循這些約定�
寄存器編號助記符用法0 zero永遠(yuǎn)返回值為0 1 at用做匯編器的暫時變量2-3 v0� v1子函�(shù)�(diào)用返回結(jié)�4-7 a0-a3子函�(shù)�(diào)用的參數(shù)8-15 t0-t7 24-25 t8-t9暫時變量,子函數(shù)使用時不需要保存與恢復(fù)16-25 s0-s7子函�(shù)寄存器變�。子函數(shù)必須保存和恢�(fù)使用過的變量在函�(shù)返回之前,從而調(diào)用函�(shù)知道這些寄存器的值沒有變��
26�27 k0,k1通常被中斷或異常處理程序使用作為保存一些系�(tǒng)參數(shù)28 gp全局指針。一些運行系�(tǒng)維護這個指針來更方便的存取“static”和“extern"變量�
29 sp堆棧指針30 s8/fp�9個寄存器變量。子函數(shù)可以用來做楨指針31 ra子函�(shù)的返回地2 MIPS32中如果有FPA(浮點協(xié)處理器),將會有32個浮點寄存器,按匯編語言的約定為$f0~$f31,MIPS32中只能實用偶�(shù)號的浮點寄存器,奇數(shù)號的用途是:在做雙精度的浮點運算時,存放該奇數(shù)號之前的偶數(shù)號浮點寄存器的剩余無法放下的32�。比如在做雙精度的浮點運算時�$1存放$0的剩余的部分,所以在MIPS32中可以通過加載偶數(shù)號的浮點寄存器而把64位的雙精度數(shù)�(jù)加載到兩個浮點寄存器中,每個寄存器存放32��
比如:l.d $02� 24(t1�
被擴充為兩個連續(xù)的寄存器加載:lwc1 $f0� 24(t1�
lwc1 $f1� 28(t1�
3 MIPS架構(gòu)中沒有X86中的PC(程序計�(shù))寄存器,它的程序計�(shù)器不是一個寄存器。因為在MIPS這樣具有流水線結(jié)�(gòu)的CPU�,程序計�(shù)器在同一時刻可以有多個給定的�,如jal指令的返回地址跟隨其后的第二條指令�
…�
jal printf move $4� $6 xxx # return here after call MIPS32中也沒有條件�,比如在X86中常見的狀�(tài)寄存器中的Z、C�(biāo)志位在MIPS32中是沒有�,但是MIPS32中是有狀�(tài)寄存�4 MIPS32中不同于其它的RISC架構(gòu)的地方是其有整數(shù)乘法部件,這個部件使用兩個特殊的寄存器HI、LO,并且提供相�(yīng)的指令mfhi/mthi,mthi/mtlo來實�(xiàn)整數(shù)乘法�(jié)果——hi/lo寄存器與通用寄存器之間的�(shù)�(jù)交換5�(shù)�(jù)加載與存儲MIPS CPU可以在一個單一操作中存�1�8個字節(jié)。文檔中和用來組成指令助記符的命名約定如下:C名字MIPS名字�?。ㄗ�?jié))匯編助記符long long dword 8 "d"代表ld int/long word 4 "w"代表lw short halfword 2 "h"代表lh char byte 1 "b"代表lb 5.1�(shù)�(jù)加載包括這樣幾條記載指令LB/LBU、LH/LHU、LW byte和short的加載有兩種方式。帶符號擴展的lb和lh指令將數(shù)�(jù)值存放在32位寄存器的低位中,剩下的高位用符號位的值來擴充(位7如果是一個byte,位15如果是一個short)。這樣就正確地將一個帶符號整數(shù)放入一�32位的帶符號的寄存器中�
不帶符號指令lbu和lhu�0來擴充數(shù)�(jù),將�(shù)�(jù)存放�32位寄存器的低位中,并將高位用零來填充�
例如,如果一個byte字節(jié)寬度的存儲器地址為t1,其值為0xFE�-2�254如果是非符號�(shù)�,那么將會在t2中放�0xFFFFFFFE�-2作為一個符號數(shù)�。t3的值會�0x000000FE�254作為一個非符號�(shù)�
lb t2� 0(t1�
lbu t3� 0(t1�
5.2�(shù)�(jù)存儲包括這樣幾條指令SB、SH、SW由于加載就是把寄存器中的�(shù)�(jù)加載到內(nèi)存中,所以不存在位擴展的問題�
6 CP0 (協(xié)處理�0)——MIPS處理器控制用于控制和�(shè)置MIPS CPU,里面包含了一些寄存器,同過對這些寄存器的不同的位的操作可以實�(xiàn)對處理器的設(shè)置CP0類似于X 86只能有內(nèi)核(高優(yōu)先級�(quán)限)訪問的一些處理器資源而前面提到的通用寄存器GPR和FPR則可以有由所有的�(yōu)先級�(quán)限訪問CP0提供了中斷異常處�、內(nèi)存管理(包括CACHE、TLB�、外�(shè)管理等途徑(而這些只能由高�(yōu)先級的內(nèi)核才能訪問到)�
6.1常見的MIPS CPU控制寄存器包括:SR(狀�(tài)寄存器) 12 Config (CPU參數(shù)�(shè)置寄存器�-16 EPC (例外程序寄存器�13、CAUSE(導(dǎo)致中斷和異常的原因寄存器� 14、BadVaddr(地址錯誤時存放地址的寄存器�8 Index- 0、Random-1、EntryLo0-2、EntryLo1-3、EntryHi-10、PageMask Count-9、Compare-11共同組成了高精度的時�6.2CP0寄存器的訪問指令mtc0 ts� #把通用寄存器ts中的�(shù)�(jù)送到�(xié)處理�0中的寄存器nn mfc0 ts� #把送到�(xié)處理�0中寄存器nn的值送到通用寄存器ts dmtc0 ts� #把通用寄存器ts中的�(shù)�(jù)送到�(xié)處理�0中的寄存器nn dmfc0 ts� #把送到�(xié)處理�0中寄存器nn的值送到通用寄存器ts 6.3起作用的寄存器及其作用時機加電后:你需要設(shè)置SR和Config寄存器,以確保CPU�(jìn)入正確的引導(dǎo)狀�(tài),并且SR寄存器還�(shè)置了中斷碼。以決定系統(tǒng)響應(yīng)哪些中斷�
�(jìn)入任何異常:處理任何例外都會�(diào)用一個“通用異常處理程序�。MIPS體系并沒有為�(jìn)入異常作任何的寄存器保存,也沒有�(guān)于堆棧方面的任何支持,�(jìn)入異常時保存的就是異常返回地址保存在EPC中。所以這些都需要操作系�(tǒng)的軟件實�(xiàn)。操作系�(tǒng)可以使用K0或者K1寄存器作為堆棧指�,指向某個位置,并且在需要保存的寄存器保存到這個棧�。然后通過Cause寄存器找到發(fā)生異常的原因,這樣才能跳轉(zhuǎn)到對�(yīng)的中斷處理程序中�
從異常返回:從異常返回到EPC制定的地址之前要把CPU的狀�(tài)回復(fù)到異常之�,好象什么事情都沒有�(fā)生一樣。在R3000中使用rfe指令作這樣的事�,但是著條指令僅僅恢�(fù)了一些寄存器中的�(nèi)�,但是并沒有�(zhuǎn)移控制指令,你需要把EPC�(nèi)容保存到一個通用寄存器中,然后調(diào)用jr指令返回到EPC指向的地址��7 MIPS的存儲管理模型MIPS32中的存儲器模型被劃分為四個大塊,其中�0x0000�0000~0x7fff,ffff�0~2G-1� USEG must be mapped (set page table and TLB)and set cache before use 0x8000�0000~0x9fff,ffff�2G~2.5G-1� KSEG0 directly mapped(no need to set page table and TLB� but need to set cache before use 0xa000�0000~0xbfff,ffff�2.5G~3G-1� KSEG1 directly mapped(no need to set page table and TLB� and never use cache 0xc000�0000~0xffff,ffff�3G~4G-1� KSEG2 muse be mapped(set page table and TLB� and set cache before use這樣的存儲器管理模型和X86差距比較大,X86有一個實模式,內(nèi)核在啟動保護模式之前,運行在實模式之下,直到�(shè)定了保護模式之后才能運行在保護模式下。在MIPS32中沒有保護模式那么系�(tǒng)是如何啟動的呢?
MIPS32中的系統(tǒng)啟動向量位于KSEG1�0xbf10�0000,由于KSEG1是directly mapped�,所以直接對�(yīng)了物理地址0x1fc0�0000,你可以在內(nèi)核中一直使�0xa000�0000~0xbfff,ffff之間的虛擬地址來訪問物理地址0~512M-1,在�(shè)置了KSEG0的cache之后,也可一使用0x8000�0000~0x9fff,ffff之間的虛擬地址來訪�0~512M-1之間的物理地址。對�512M以上的物理地址只能由KSEG2和USEG通過頁表訪問�
8 MIPS32中的狀�(tài)寄存器SR狀�(tài)寄存器來�(shè)置處理器的一些功能集�,包括設(shè)置設(shè)置協(xié)處理�0~3的可用性的位CU0~CU3�28~31�
�(fù)位向量BEV中斷屏蔽�8~15 KUc、IEc0~1,基本的CPU保護單位KUc�1時表示運行在�(nèi)核態(tài),為0時運行在用戶模式。在�(nèi)核態(tài)�,可以訪問所有的地址空間和協(xié)處理�0,運行在用戶�(tài)下值只能訪�0x0000�0000~0x7fff,ffff之間的地址空間�
KUp、IEp2~3�(dāng)異常�(fā)生時,硬件把KUc、IEc的值保存到KUp、IEp中,并且將KUc、IEc�(shè)置為[1�0]——內(nèi)核態(tài)、關(guān)中斷。異常返回時rfe指令可以把KUp、IEp的內(nèi)容復(fù)制到KUc、IEc中KUo、IEo�(dāng)異常�(fā)生時,硬件把KUp、IEp的值保存到KUo、IEo�;返回時把KUo、IEo的內(nèi)容復(fù)制到KUp、IEp��
上面三對KU/IE位構(gòu)成了深度2的棧,異常發(fā)生時,硬件自動壓�,rfe指令從異常返回時,從棧中恢復(fù)�(shù)值還有一些其它的功能和狀�(tài)位,可以參考相�(yīng)的文�9 MIPS32中的Cause寄存器BD位:EPC中正常情況下存放了發(fā)生異常的指令,但是當(dāng)著條指令存放在調(diào)�(zhuǎn)指令的延遲槽中時,那么EPC中存放的是這個跳�(zhuǎn)指令,否則這條跳轉(zhuǎn)指令將得不到�(zhí)��
IP位:告訴用戶來臨的中斷ExcCode:這是一�5位的代碼,告訴你哪一條異常發(fā)生了,可以根�(jù)這個從通用異常處理程序跳裝到特定異常處理程序中�
10 MIPS32的C語言中參�(shù)傳遞和返回值的約定caller至少使用16bytes�??臻g存放參數(shù),然后把�16 bytes存放到通用寄存器a0~a3�,called subroutine直接使用寄存器中的參�(shù),同時caller堆棧中的16bytes的數(shù)�(jù)可以不去理會��
需要理解的是帶有浮點參�(shù)和結(jié)�(gòu)體的參數(shù)傳遞,對于帶有浮點參�(shù)的傳遞需要看個參�(shù)是否是浮點,如果是浮點則將參�(shù)放到$f12�$f14這兩個浮點寄存器�,如果個參�(shù)不是浮點�(shù),則不用浮點寄存器存放參�(shù)。對于結(jié)�(gòu)體的參數(shù)傳遞和x86類似對于整數(shù)和指針類型的參數(shù)返回值一般通過通用寄存器v0�$2)返�,對于浮點返回類型,一般存放在$f0中返��
維庫電子�,電子知識,一查百��
已收錄詞�160338�