- 协处理器(coprocessor)
协处理器是用来减轻cpu负担只执行特定指令的处理器
arm微处理器可支持多达16个协处理器,用于协处理操作
但是一般只附带最后一个处理器cp15
协处理器和MMU,TLB,cache等处理有关
通过这两个指令mcr/mrc 与协处理器进行指令传输
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #00002000 @clear bits v
bic r0, r0, #00000007 @clear bits CAM
orr r0, r0, #00000002 @set bit A
orr r0, r0, #00000800 @set bit Z
mcr p15, 0, r0,c1, c0, 0
-
访存指令详解
在只需要进行单字传输时,用ldr和str进行访存即可
当需要与内存见的大量信息传输时就需要用到ldm/stm两条指令了
ldm/stm r0,{r1,r2,r3}
指令后缀
- ia (increase after) 先将数据写入,再增加地址
- ib (increase before)先增加地址,再写入数据
- da (decrese after)先将数据写入,再减少地址
- db (decrese before)先减少地址,再写入数据
- fd (full decrease) 满减栈
- fa (full decrease) 满增栈
- ed (empty add) 空减栈
- ea (empty add) 空增栈
减栈:地址逐渐减少
增栈:地址逐渐增加
空栈:指针直接指向目标地址,即指向地址的内存空间内没有存放数据
满栈:指针指向上次的最后一个地址,需要偏移后才指向目标地址,即指向地址的内存空间内存放了上一次写入的最后一个数据
-
!与^
- !是在ldm过程中的增加或减少写会到目标寄存器中去
- ^的作用是,在目标寄存器中有pc时,会同时将spsr写入到cpsr
一般用于异常模式
ldmia r0,{r2-r3} @r0地址不偏移
ldmia !r0,{r2-r3} @装填完成后的地址赋给r0
ldmfd sp!,{r0-r6,pc}
ldmfd sp!,{r0-r6,pc}^ @将spsr恢复到cpsr
- 细节了解
- MMU处理器:实现虚拟内存有两方面的工作:一是高效的管理线性地址和物理地址的映射关系;二是严格的内存访问权限检测机制。于是,现在的CPU处理器就引入了MMU硬件模块来处理这两个问题。
在没有MMU的处理器中,CPU内部执行单元产生的内存地址信号就是物理地址,将被直接通过地址总线发送到芯片引脚,被内存芯片接收。在有MMU且启用的处理器中,CPU执行单元产生的地址信号是虚拟地址,其在被发送到内存芯片之前将被MMU截获,MMU会负责把虚拟地址翻译成物理地址,然后发到内存芯片地址引脚上。
- MMU处理器:实现虚拟内存有两方面的工作:一是高效的管理线性地址和物理地址的映射关系;二是严格的内存访问权限检测机制。于是,现在的CPU处理器就引入了MMU硬件模块来处理这两个问题。