协处理器中的寄存器访问指令只能发生在系统模式下,而用户模式被视为未定义异常,也可以通过SWI调用,CP15有16个寄存器(C0-C15),确切说是16类,因为实际物理寄存器会大于16个。
协处理器指令:
"cond p15 opcode_1 Rd CRn CRm opcode_2"
cond: 为条件码,如MCR、MRC等
p15: 指的是15号协处理器
opcode_1:操作码,对于CP15协处理器始终为0x00
Rd: 源,ARM寄存器,不能为PC
CRn: 目标,CP15寄存器(C0-C15)
CRm: 目标附加操作数,用于区分同一编号(C0-C15)的不同物理寄存器,如无附加信息一般写C0
opcode_2:附加信息,用于区分同一编号(C0-C15)的不同物理寄存器,如无附加信息一般为0x00
如:
mrc p15, 0, r1, c0, c0, 0 (从C0读取处理器ID编码)
mrc p15, 0, r1, c0, c0, 1 (从C0读取Cache详细资料)
1、CP15协处理器中的寄存器组:
C0:包括主标识符和Cache类型标识,根据opcode_2的不同来区分
如:
mrc p15, 0, r1, c0, c0, 0 (从C0读取处理器ID编码)
mrc p15, 0, r1, c0, c0, 1 (从C0读取Cache详细资料)
C1:用于配置MMU,写保护、地址对齐、cache使能禁止、大小端、中断向量表地址等
如:
mrc p15, 0, r0, c1, 0, 0 (读时,CRm=0,opcode_2=0)
orr r0, #01 (使用MMU)
mcr p15, 0, r0, c1, 0, 0 (写时,CRm=0,opcode_2=0)
C2:用于保存内存中页表的基地址
C3:设置域的访问控制权限属性
C4:保留
C5:内存访问失效状态指示
C6:内存访问失效地址
C7:用于控制cache和写缓冲区
C8:控制与清除TLB内容操作
C9:cache内容锁定寄存器
C10:控制与锁定TLB内容相关操作
C11:保留
C12:保留
C13:保存当前进程标识号PID(0-127)
C14:保留
C15:测试配置,因不同设计而异
2、TLB
叫快表,在CPU中开辟的RAM访问速度与寄存器相当,大小为8-16字,用于缓存存放页表中的描述符的,当CPU需要访问内存时,先在TLB中查找需要的地址变换条目,如果条目不存在,就从内存中的页表中查询,并将结果添加到TLB。
3、使无效TLB,当页表内容改变或更新页表(C2改变了)时需要使TLB的内容全部无效
4、高速缓冲存储器(Cache)和写缓冲区(write buffers),cache是完全由硬件实现的,WB是一个高速
存储器,主要用于提高CPU向主存写入数据时的效率,Write Back用于写回法和写通法的缓存
5、当得到了需要的地址变换条目后,将进行以下操作:
1)、得到该虚拟地址对应的物理地址
2)、根据条目中的C控制位和B控制位决定是否缓存该内存访问的结果到cache
3)、根据存取权限控制位和域访问控制位确定该内存访问是否被允许,如果该内存访问
不被允许,CP15向ARM处理器报告存储访问中止
4)、对于不允许缓存的存储访问,使用步骤1中得到的物理地址访问内存,对于允许缓存的存储访问,如果在cache中命中,则忽略物理地址;如果cache没有命中,则使用步骤1 得到的物理地址访问内存,并把该块数据读取到cache中
6、快速上下文切换:
简称FCSE,用于避免在进程间切换时造成的虚拟地址到物理地址的重映射,将各进程的相同虚拟空间变换成不同的虚拟空间,从而避免重映射,在ARM系统中,4GB虚拟空间被分成128个进程空间块(每个进程可以建立300多个线程),每个进程空间块大小为32MB,每个进程空间块中可以包含一个进程(0x00000000-0x01ffffff),PID从0-127,进程使用的虚拟地址空间为:PID x 0x02000000-PID x 0x02000000+0x01ffffff。过程如下:
CPU -> VA -> FCSE -> MVA -> MMU -> PA
7、
MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2>
其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作:
----------------------------------------------------------------------------------
<CRm> <opcode_2> 含义 数据
----------------------------------------------------------------------------------
C0 4 等待中断激活 0
C5 0 使用无效整个Cache 0
C5 1 使无效指令Cache 中的某块 虚地址
C5 2 使无效指令Cache 中的某块 组号/组内序号
C5 4 清空预取缓冲区 0
C5 6 清空整个跳转目标Cache 0
C5 7 清空跳转目标Cache中的某块 生产商定义
C6 0 使无效整个数据Cache 0
C6 1 使无效数据Cache 中的某块 虚地址
C6 2 使无效数据Cache 中的某块 组号/组内序号
C7 0 使数据Cache 和指令Cache 无效 0
C7 1 使无效整个Cache 中的某块 虚地址
C7 2 使无效整个Cache 中的某块 组号/组内序号
C8 2 等待中断激活 0
C10 1 清空数据Cache 中某块 虚地址
C10 2 清空数据Cache 中某块 组号/组内序号
C10 4 清空写缓冲区 0
C11 1 清空整个Caceh 中某块 虚地址
C11 2 清空整个Caceh 中某块 组号/组内序号
C13 1 预取指令Cache 中某块 虚地址
C14 1 清空并使无效数据Cache中某块 虚地址
C14 2 清空并使无效数据Cache中某块 组号/组内序号
C15 1 清空并使无效整个Cache中某块 虚地址
C15 2 清空并使无效整个Cache中某块 组号/组内序号
----------------------------------------------------------------------------------
协处理器指令:
"cond p15 opcode_1 Rd CRn CRm opcode_2"
cond: 为条件码,如MCR、MRC等
p15: 指的是15号协处理器
opcode_1:操作码,对于CP15协处理器始终为0x00
Rd: 源,ARM寄存器,不能为PC
CRn: 目标,CP15寄存器(C0-C15)
CRm: 目标附加操作数,用于区分同一编号(C0-C15)的不同物理寄存器,如无附加信息一般写C0
opcode_2:附加信息,用于区分同一编号(C0-C15)的不同物理寄存器,如无附加信息一般为0x00
如:
mrc p15, 0, r1, c0, c0, 0 (从C0读取处理器ID编码)
mrc p15, 0, r1, c0, c0, 1 (从C0读取Cache详细资料)
1、CP15协处理器中的寄存器组:
C0:包括主标识符和Cache类型标识,根据opcode_2的不同来区分
如:
mrc p15, 0, r1, c0, c0, 0 (从C0读取处理器ID编码)
mrc p15, 0, r1, c0, c0, 1 (从C0读取Cache详细资料)
C1:用于配置MMU,写保护、地址对齐、cache使能禁止、大小端、中断向量表地址等
如:
mrc p15, 0, r0, c1, 0, 0 (读时,CRm=0,opcode_2=0)
orr r0, #01 (使用MMU)
mcr p15, 0, r0, c1, 0, 0 (写时,CRm=0,opcode_2=0)
C2:用于保存内存中页表的基地址
C3:设置域的访问控制权限属性
C4:保留
C5:内存访问失效状态指示
C6:内存访问失效地址
C7:用于控制cache和写缓冲区
C8:控制与清除TLB内容操作
C9:cache内容锁定寄存器
C10:控制与锁定TLB内容相关操作
C11:保留
C12:保留
C13:保存当前进程标识号PID(0-127)
C14:保留
C15:测试配置,因不同设计而异
2、TLB
叫快表,在CPU中开辟的RAM访问速度与寄存器相当,大小为8-16字,用于缓存存放页表中的描述符的,当CPU需要访问内存时,先在TLB中查找需要的地址变换条目,如果条目不存在,就从内存中的页表中查询,并将结果添加到TLB。
3、使无效TLB,当页表内容改变或更新页表(C2改变了)时需要使TLB的内容全部无效
4、高速缓冲存储器(Cache)和写缓冲区(write buffers),cache是完全由硬件实现的,WB是一个高速
存储器,主要用于提高CPU向主存写入数据时的效率,Write Back用于写回法和写通法的缓存
5、当得到了需要的地址变换条目后,将进行以下操作:
1)、得到该虚拟地址对应的物理地址
2)、根据条目中的C控制位和B控制位决定是否缓存该内存访问的结果到cache
3)、根据存取权限控制位和域访问控制位确定该内存访问是否被允许,如果该内存访问
不被允许,CP15向ARM处理器报告存储访问中止
4)、对于不允许缓存的存储访问,使用步骤1中得到的物理地址访问内存,对于允许缓存的存储访问,如果在cache中命中,则忽略物理地址;如果cache没有命中,则使用步骤1 得到的物理地址访问内存,并把该块数据读取到cache中
6、快速上下文切换:
简称FCSE,用于避免在进程间切换时造成的虚拟地址到物理地址的重映射,将各进程的相同虚拟空间变换成不同的虚拟空间,从而避免重映射,在ARM系统中,4GB虚拟空间被分成128个进程空间块(每个进程可以建立300多个线程),每个进程空间块大小为32MB,每个进程空间块中可以包含一个进程(0x00000000-0x01ffffff),PID从0-127,进程使用的虚拟地址空间为:PID x 0x02000000-PID x 0x02000000+0x01ffffff。过程如下:
CPU -> VA -> FCSE -> MVA -> MMU -> PA
7、
MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2>
其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作:
----------------------------------------------------------------------------------
<CRm> <opcode_2> 含义 数据
----------------------------------------------------------------------------------
C0 4 等待中断激活 0
C5 0 使用无效整个Cache 0
C5 1 使无效指令Cache 中的某块 虚地址
C5 2 使无效指令Cache 中的某块 组号/组内序号
C5 4 清空预取缓冲区 0
C5 6 清空整个跳转目标Cache 0
C5 7 清空跳转目标Cache中的某块 生产商定义
C6 0 使无效整个数据Cache 0
C6 1 使无效数据Cache 中的某块 虚地址
C6 2 使无效数据Cache 中的某块 组号/组内序号
C7 0 使数据Cache 和指令Cache 无效 0
C7 1 使无效整个Cache 中的某块 虚地址
C7 2 使无效整个Cache 中的某块 组号/组内序号
C8 2 等待中断激活 0
C10 1 清空数据Cache 中某块 虚地址
C10 2 清空数据Cache 中某块 组号/组内序号
C10 4 清空写缓冲区 0
C11 1 清空整个Caceh 中某块 虚地址
C11 2 清空整个Caceh 中某块 组号/组内序号
C13 1 预取指令Cache 中某块 虚地址
C14 1 清空并使无效数据Cache中某块 虚地址
C14 2 清空并使无效数据Cache中某块 组号/组内序号
C15 1 清空并使无效整个Cache中某块 虚地址
C15 2 清空并使无效整个Cache中某块 组号/组内序号
----------------------------------------------------------------------------------