MIPS处理器介绍
1. 介紹
MIPS處理器是一種RISC處理器,被廣泛使用在許多電子產(chǎn)品、網(wǎng)絡(luò)設(shè)備、個人娛樂裝置與商業(yè)裝置上
2. 地址空間
MIPS處理器對地址空間的使用和處理和傳統(tǒng)CISC CPU有著微妙的不同;在MIPS CPU里,程序中的地址和實際的物理地址不同,分別稱之為程序地址和物理地址
MIPS CPU有用戶模式和核心模式兩種特權(quán)級
從核心態(tài)到用戶態(tài)的變化并不改變操作的行為,只是有時某些操作被認為是非法的
在用戶態(tài),地址最高位為1的任何程序地址都是非法的并會導(dǎo)致自陷;還有,有些指令在用戶態(tài)將會導(dǎo)致異常
對于32位MIPS處理器,程序地址空間(4G)劃分為四大區(qū)域,不同區(qū)域有不同的屬性,如下圖所示
kuseg : 0x00000000 ------ 0x7fffffff (2G) user space
kseg0 : 0x80000000 ------ 0x9fffffff (512M) unmapped, cached
kseg1 : 0xa0000000 ------ 0xbfffffff (512M) unmapped, uncached
kseg2 : 0xc0000000 ------ 0xffffffff (1G) mapped, cached
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) }
.csharpcode pre { margin: 0 }
.csharpcode .rem { color: rgba(0, 128, 0, 1) }
.csharpcode .kwrd { color: rgba(0, 0, 255, 1) }
.csharpcode .str { color: rgba(0, 96, 128, 1) }
.csharpcode .op { color: rgba(0, 0, 192, 1) }
.csharpcode .preproc { color: rgba(204, 102, 51, 1) }
.csharpcode .asp { background-color: rgba(255, 255, 0, 1) }
.csharpcode .html { color: rgba(128, 0, 0, 1) }
.csharpcode .attr { color: rgba(255, 0, 0, 1) }
.csharpcode .alt { background-color: rgba(244, 244, 244, 1); 100%; margin: 0 }
.csharpcode .lnum { color: rgba(96, 96, 96, 1) }
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) }
.csharpcode pre { margin: 0 }
.csharpcode .rem { color: rgba(0, 128, 0, 1) }
.csharpcode .kwrd { color: rgba(0, 0, 255, 1) }
.csharpcode .str { color: rgba(0, 96, 128, 1) }
.csharpcode .op { color: rgba(0, 0, 192, 1) }
.csharpcode .preproc { color: rgba(204, 102, 51, 1) }
.csharpcode .asp { background-color: rgba(255, 255, 0, 1) }
.csharpcode .html { color: rgba(128, 0, 0, 1) }
.csharpcode .attr { color: rgba(255, 0, 0, 1) }
.csharpcode .alt { background-color: rgba(244, 244, 244, 1); 100%; margin: 0 }
.csharpcode .lnum { color: rgba(96, 96, 96, 1) }
不同區(qū)域詳細信息如下所示:
kuseg: 用戶態(tài)可用的地址,只有在MMU轉(zhuǎn)換后才可用
kseg0: 將地址最高位清零,即可映射到物理地址段512M(0x00000000~0x1FFFFFFF),這種映射關(guān)系很簡單,通常稱之為"非轉(zhuǎn)換的"地址區(qū)域,對這段地址的存取必須通過cache。通常一個沒有MMU的系統(tǒng)會使用這段地址作為其絕大多數(shù)程序和數(shù)據(jù)的存放位置;對于有MMU的系統(tǒng),操作系統(tǒng)核心會存放在這個區(qū)域.
kseg1: 將地址的高三位清零可映射到相應(yīng)的物理地址上,與kseg0映射的物理地址一樣,但kseg1是非cache存取的。kseg1是唯一在系統(tǒng)重啟時能正常工作的地址空間。這也是為什么啟動入口向量是0xBFC00000,這個向量對應(yīng)的物理地址是0x1FC00000,因此要使用這個地址區(qū)域去存取初始的程序ROM
kseg2: 這塊區(qū)域只能在核心態(tài)下使用并且要經(jīng)過MMU的轉(zhuǎn)換。在MMU設(shè)置好之前,不能存取該區(qū)域。有時該區(qū)域被分為kseg2和kseg3,意在強調(diào)低半部分(kseg2)可供運行在管理態(tài)的程序使用
3. 地址映射
以BCM63268為例介紹MIPS處理器地址映射
其中,物理地址分配圖和虛擬地址映射圖
CPU拿到地址(虛擬地址),其轉(zhuǎn)換過程如下步驟:
(1) 判斷當(dāng)前是kernel mode還是user mode
(2) 如果是kernel mode
(A) 訪問的地址是kuseg或者kseg2,進行 TLB 查找;如果查找不成功,exception。如果查找成功,得到物理地址
(B) 如果訪問的地址是 kseg0/kseg1,不進行TLB 查找;通過減去一個偏移量得到物理地址
(3) 如果是user mode
(A) 訪問地址kuseg,進行TLB 查找。如果查找不成功,exception。如果查找成功,得到物理地址
(B) 訪問kseg0/1/2,exception
4. 引導(dǎo)過程
我們知道,kseg0和kesg1大小均為512MB,且均映射至物理地址[0x0000 0000 ~ 0x2000 0000]范圍內(nèi),只是映射的方式不同,但是他們的地址不能重疊
kseg0: 虛擬地址 = 物理地址 + 0x8000 0000
kseg1: 虛擬地址 = 物理地址 + 0xA000 0000
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) }
.csharpcode pre { margin: 0 }
.csharpcode .rem { color: rgba(0, 128, 0, 1) }
.csharpcode .kwrd { color: rgba(0, 0, 255, 1) }
.csharpcode .str { color: rgba(0, 96, 128, 1) }
.csharpcode .op { color: rgba(0, 0, 192, 1) }
.csharpcode .preproc { color: rgba(204, 102, 51, 1) }
.csharpcode .asp { background-color: rgba(255, 255, 0, 1) }
.csharpcode .html { color: rgba(128, 0, 0, 1) }
.csharpcode .attr { color: rgba(255, 0, 0, 1) }
.csharpcode .alt { background-color: rgba(244, 244, 244, 1); 100%; margin: 0 }
.csharpcode .lnum { color: rgba(96, 96, 96, 1) }
即所有的外設(shè)最大物理尋址空間為512MB
一個典型的 MIPS SOC的物理地址布局分布如下:
0x0000 0000 ~ 0x0FFF FFFF : SDRAM區(qū)域, 最大為256MB, 映射至kseg0區(qū)域
0x1000 0000 ~ 0x10FF FFFF : 寄存器地址, 映射至kseg1區(qū)域
0x1FC0 0000 ~ ? : 啟動FLASH, 大小為止映射至kseg1區(qū)域
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) }
.csharpcode pre { margin: 0 }
.csharpcode .rem { color: rgba(0, 128, 0, 1) }
.csharpcode .kwrd { color: rgba(0, 0, 255, 1) }
.csharpcode .str { color: rgba(0, 96, 128, 1) }
.csharpcode .op { color: rgba(0, 0, 192, 1) }
.csharpcode .preproc { color: rgba(204, 102, 51, 1) }
.csharpcode .asp { background-color: rgba(255, 255, 0, 1) }
.csharpcode .html { color: rgba(128, 0, 0, 1) }
.csharpcode .attr { color: rgba(255, 0, 0, 1) }
.csharpcode .alt { background-color: rgba(244, 244, 244, 1); 100%; margin: 0 }
.csharpcode .lnum { color: rgba(96, 96, 96, 1) }
從前面可以了解到,外設(shè)尋址空間范圍最大為0x2000 0000
而從物理內(nèi)存布局可以看到第一塊FLASH的起始地址為0x1FC0 0000,
其距離0x2000 0000只有4MB大小,而FLASH大小一般為8MB或16MB
此處我的理解4MB大小主要是用于BootLoader,完成將內(nèi)核映像從FLASH搬運至SDRAM
因為啟動的時候MMU和Cache均未初始化,只有kseg1這段地址空間可以正常讀取并處理,
故在這4MB地址區(qū)域上完成搬運及硬件初始化工作,然后跳轉(zhuǎn)到kseg0去執(zhí)行。
TIP: 對于MIPS24K,其起始地址改到了0xbf000000,距離0x1FFF FFFF有16MB的空間
從上可知,當(dāng)SDRAM和FLASH較大時,將可能出現(xiàn)無法尋址的情況
對于第二塊對FLASH,可掛載至0x10FF FFFF ~ 0x1FC0 0000的地址空間內(nèi)
5. MIPS寄存器
MIPS體系架構(gòu)有32個通用寄存器,以及協(xié)處理器
5.1 通用寄存器
MIPS通用寄存器在匯編程序中可以用$0 ~ $31來表示,或者用寄存器的名字$sp, $t1, $ra...
堆棧(Stack)的增長方向是:從內(nèi)存高地址向地址
Register Name Usage $0 zero 常量0 $1 $at 保留給匯編器(Reserved for assembler) $2-$3 $v0-$v1 函數(shù)調(diào)用返回值(values for results and expression evaluation) $4-$7 $a0-$a3 函數(shù)調(diào)用參數(shù)(arguments) $8-$15 $t0-$t7 臨時寄存器 $16-$23 $s0-$s7 保存寄存器(需要SAVE/RESTORE) $24-$25 $t8-$t9 同$t0-$t7 $26-$27 $k0-$k1 僅供中斷(interrupt/trap)處理函數(shù)使用 $28 $gp 全局指針(Global Point) $29 $sp 堆棧指針,指向堆棧的棧頂(Stack Point) $30 $fp 幀指針(Frame Point) $31 $ra 返回地址(return address)
TIP: $30 is stale acutally, and can be simply used as $t8
關(guān)于通用寄存器更多內(nèi)容,參考<MIPS寄存器介紹>
5.2 協(xié)處理器
在MIPS體系結(jié)構(gòu)中,最多支持4個協(xié)處理器(Co-Processor);其中,協(xié)處理器CP0起到控制CPU的作用
MMU、異常處理、乘除法等功能,都依賴于協(xié)處理器CP0來實現(xiàn)
更多內(nèi)容參考<Coprocessor 0 - MIPS>
參考:
<MIPS Quick Tutorial>
<A Quick Introduction to SPIM>
<MIPS Assembly Language Programming>
<MIPS Assembly Language Programmer's Guide>
總結(jié)
- 上一篇: Eclipse 日文乱码怎么解决Shif
- 下一篇: 大象 P 转身开箱即用,港大、南大、清华