S3C2440 cp15協處理器詳解

2021-08-03 22:30:57 字數 4833 閱讀 4044

2440的協處理器cp15總共有c0~c15這16個協處理器暫存器,各自具有一定的功能定義。但總的來說,cp15主要跟以下功能有關:

1、獲取device id和cache type等一些cpu相關資訊。

2、mmu操作。包括mmu的使能和禁止,虛擬位址到實體地址的對映機制建立

3、訪問許可權控制。主要用來實現安全機制和linux的寫時複製(copy on write)。

4、設定時鐘模式。init.s中mmu_setasyncbusmode和mmu_setfastbusmode這兩個函式

下面我會分別就以上4種應用詳細分析,並配合**進行講解。

1、獲取device id和cache type。這兩個資訊存在p15的c0暫存器中,有意思的是c0暫存器有兩個實體,乙個用來存device id(叫做c0.0),另乙個用來存cache type(叫做c0.1)這兩個暫存器在讀取時命令不同,請參看以下示例**。

[cpp]view plain

copy

u32 p15_readid(

void

)    

return

id;  

}  u32 p15_readcachetype(void

)    

return

id;  

}  

對以上**的說明:

(1) cpu從p15讀出暫存器只能使用mrc指令。同樣,寫入p15暫存器只能使用mcr指令。這兩個指令也是p15唯一可以接受的兩個指令。

(2) __asm用來在c**中內嵌彙編。

(3) 從**中可以看出,讀出c0.0和c0.1的**,在opcode2處有所不同。(讀出c0.1時,opcode2為1.c0.0時opcode2省略)。

(4) 我使用的s3c2440實際讀出的device id為 0x41129200;cache type為:0xd172172。和jlink commander識別出得引數對比是相同的。

2、mmu操作。

和mmu有關的p15暫存器為c1(control register)和c2(ttb translation table base register)。其中c2比較簡單,就是用來儲存從虛擬位址到實體地址的位址轉換表的基位址的**換表存放在記憶體中,譬如可以放在0x30000000位址),因此我們在初始化mmu的時候,只要將規劃的轉換表基位址用mcr指令傳送到該c2暫存器即可。而c1暫存器為控制暫存器,詳細定義如下:

register 1 - control (read/write) 

all values set to 0 at power-up. 

o    bit    0 - on-chip mmu turned off (0) or on (1) 

用來關閉或使能mmu

o    bit    1 - address alignment fault disabled (0) or enabled (1) 

關閉或開啟位址對齊檢查

o    bit    2 - data cache turned off (0) or on (1) 

資料cache開啟或關閉

o    bit    3 - write buffer turned off (0) or on (1) 

o    bit    7 - little-endian operation if 0, big-endian if 1 

用來選擇大小端格式

o    bit    8 - system bit - controls the mmu permission system 

o    bit    9 - rom bit - controls the mmu permission system 

bit8(s bit ) and bit9(r bit)用來管理mmu訪問許可權,第3部分會詳述

o    bit  12 - instruction cache turned off (0) or on (1)」 

指令cache開啟或關閉

obit  13 - base location of exception registers. 0x00000000(0) or 0xffff0000(1)

上電啟動位址。

o    bit  14 - round robin replacement ,random replacement(0) or round-robin replacement(1).

不太懂這個

o    bit  15 ~ bit29   reserved

o    bit  30  nf bit

bit30 和 bit31共同用來決定匯流排模式。

ia:nf = 00 fastbus mode 

o    bit  31  ia bit

01 synchronous mode 

10 reserved

11 asynchronous mode

結合以上對c1暫存器的位定義的分析,我們來看看下面這個函式:

[cpp]view plain

copy

void

mmu_init(

void

)       

}  

函式中使用arm暫存器r0作為和協處理器暫存器的介面。mcr p15,0,r0,c2,c0,0這句將r0中得值(0x30000000,這個是我們規劃的轉換表的基位址)放入(因此是mcr,所以是從arm暫存器到p15協處理器暫存器)c2中。c2即是p15中的轉換表基址。

[cpp]view plain

copy

"white-space:pre"

>  mrc p15,0,r0,c1,c0,0;    

// 讀出協處理器c1

orr r0,r0,#01;          // 或操作,使最低位為1

mcr p15,0,r0,c1,c0,0;   // 給c1賦值 

典型的讀-改-寫三步操作,目的就是將c1暫存器的bit0置1而同時不影響其他位。根據上面的暫存器定義可知,c1的bit0為mmu enable or disable,因此該三句**實際上是開啟了mmu。(注意mmu開啟前後,位址空間發生了變化。mmu開啟前程式是工作在實體地址空間的,而mmu開啟後程式便工作在了虛擬位址空間)  

c1中跟mmu有關的還有data cache和instruction cache的開啟和關閉,s bit和 r bit聯合組成的訪問許可權控制等位。另外,c1中還有其他一些我們可能會用到的資訊位。

譬如:bit7用來選擇大小端模式,bootloader中一般會有**,通過設定該位來告知cpu當前板子使用的是little endian or big endian。(因為該位上電預設是0,因此預設的模式為小端模式。); bit13為上電啟動位址,也就是reset excetion復位異常的入口位址。上電預設也是0,因此預設的上電啟動位址為0x00000000。當我們使用mcr指令將該位置1時,便可以將reset exception設定到 0xffff0000,記得這個好像是為了wince的移植支援設計的。

3、訪問許可權控制。

訪問許可權控制主要由c3(domain access control register)和c1中的s bit 和r bit共同控制。詳細情況請參考 

從上面鏈結中的介紹可以看出,c3中的32bit正好組成16組,每組占用2bit,這兩bit若為0x00,那麼具體的訪問規則則由s bit + r bit決定。若為0x01或0x10或0x11則s bit和r bit不起作用。 其實所有的情況都包含在下面這張表中了aps

rsupervisor

permissions

user permissions

description000

0no access

no access

any access generates a permission fault001

0read-only

no access

only supervisor read permitted000

1read-only

read-only

any write generates a permission fault001

1reserved--

01xxread/write

no access

access allowed only in supervisor mode10x

xread/write

read-only

writes in user mode cause permission fault11x

xread/write

read/write

all access types permitted in both modesxx1

1reserved--

4、設定bus mode

bootloader中有兩個函式是用來設定bus mode的,關於這個bus mode不是很清楚具體情況,我們這裡只是分析其操作過程。

mmu_setasyncbusmode

mrc p15,0,r0,c1,c0,0

;  讀出c1

orr r0,r0,#r1_nf:or:r1_ia

;  mcr p15,0,r0,c1,c0,0

; r1的nf和ia位置1,11對應 asynchronus bus mode

mov_pc_lr

mmu_setfastbusmode

mrc p15,0,r0,c1,c0,0

bic r0,r0,#r1_ia:or:r1_nf

; 清零nf和ia這兩位,00對應 fast bus mode

mcr p15,0,r0,c1,c0,0

mov_pc_lr

s3c2440 cp15協處理器

2440的協處理器cp15總共有c0 c15這16個協處理器暫存器,各自具有一定的功能定義。但總的來說,cp15主要跟以下功能有關 1 獲取device id和cache type等一些cpu相關資訊。2 mmu操作。包括mmu的使能和禁止,虛擬位址到實體地址的對映機制建立 3 訪問許可權控制。主要...

協處理器CP15

在基於arm的嵌入式應用系統中,儲存系統通常是通過系統控制協處理器cp15完成的。arm處理器使用協處理器15 cp15 的暫存器來控制cache tcm和儲存器管理。cp15包含16個32位的暫存器,其編號為0 15。mcr arm暫存器到協處理器暫存器的資料傳送 mrc 協處理器暫存器到arm暫...

協處理器CP15操作指令

mcr mrc mrc用於讀取cp15中的暫存器 mcr用於寫入cp15中的暫存器 協處理器 被主cpu呼叫,協助主cpu實現某種功能 arm設計支援多達16個協處理器,但是一般soc只實現其中的cp15 協處理器和mmu cache tlb等處理有關,功能上和作業系統的虛擬位址對映 cache管理...