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管理...