汇编的知识你懂吗?

2016-12-27 15:30
协处理器中的寄存器访问指令只能发生在系统模式下,而用户模式被视为未定义异常,也可以通过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中某块   组号/组内序号