S3C2440 cp15协处理器详解
来源:互联网 发布:数据缺失的处理方法 编辑:程序博客网 时间:2024/04/29 04:52
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)这两个寄存器在读取时命令不同,请参看以下示例代码。
U32 P15_ReadID(void){U32 id;__asm{mrcp15,0,id,c0,c0;}return id;}U32 P15_ReadCacheType(void){U32 id;__asm{mrcp15,0,id,c0,c0,1;}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打开或关闭
o Bit 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寄存器的位定义的分析,我们来看看下面这个函数:
void MMU_Init(void){ __asm{ mov r0,#0x30000000; // r0=TTBase 即页表的基地址 mcr p15,0,r0,c2,c0,0; // C2中存放地址转换表基地址 mvn r0, #0; // 数据取反传送指令 mcr p15,0,r0,c3,c0,0; // 访问类型为管理者权限 mrc p15,0,r0,c1,c0,0; // 读出协处理器C1 orr r0,r0,#01; // 或操作,使最低位为1 mcr p15,0,r0,c1,c0,0; // 给C1赋值 }}函数中使用ARM寄存器r0作为和协处理器寄存器的接口。mcr p15,0,r0,c2,c0,0这句将r0中得值(0x30000000,这个是我们规划的转换表的基地址)放入(因此是mcr,所以是从ARM寄存器到p15协处理器寄存器)c2中。c2即是p15中的转换表基址。
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共同控制。详细情况请参考 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0151c/I273867.html。
从上面链接中的介绍可以看出,c3中的32bit正好组成16组,每组占用2bit,这两bit若为0x00,那么具体的访问规则则由S bit + R bit决定。若为0x01或0x10或0x11则S bit和R bit不起作用。 其实所有的情况都包含在下面这张表中了
00
0
0
No access
No access
Any access generates a permission fault
00
1
0
Read-only
No access
Only Supervisor read permitted
00
0
1
Read-only
Read-only
Any write generates a permission fault
00
1
1
Reserved
-
-
01
x
x
Read/write
No access
Access allowed only in Supervisor mode
10
x
x
Read/write
Read-only
Writes in User mode cause permission fault
11
x
x
Read/write
Read/write
All access types permitted in both modes
xx
1
1
Reserved
-
-
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协处理器详解
- S3C2440 cp15协处理器详解
- S3C2440 cp15协处理器详解
- s3c2440 cp15协处理器
- s3c2440 cp15协处理器
- ARM协处理器CP15寄存器详解
- (转)ARM协处理器CP15寄存器详解
- ARM协处理器CP15寄存器详解
- ARM协处理器CP15寄存器详解
- (转)ARM协处理器CP15寄存器详解
- ARM协处理器CP15寄存器详解
- ARM协处理器CP15寄存器详解
- ARM协处理器CP15寄存器详解
- CP15协处理器详解以及操作
- ARM CP15协处理器
- ARM CP15协处理器
- ARM9协处理器CP15
- ARM协处理器CP15
- poj_1258 Agri-Net
- 内存管理详解
- MFC控件扩展性设置(按钮、图片、超链接)
- 从HTML5统治世界的说法来看Native APP 和 WEB APP 的差别
- openstack下虚拟机的监控
- S3C2440 cp15协处理器详解
- cman not started: Local host name resolves to 127.0.0.1; fix /etc/hosts before starting cluster
- poj_1679 The Unique MST
- oracle查看用户所在表空间
- RTX Server SDK跨服务器调用 发消息提醒
- hdu 1106 排序
- Android的TextView使用Html来处理图片显示、字体样式、超链接等
- hdu 1174 爆头
- OpenStack Nova启动一个虚拟机内部流程