zoukankan      html  css  js  c++  java
  • 浅析ARM协处理器CP15寄存器有关指令:MCRMRC

    ref:http://blog.csdn.net/gameit/article/details/13169405


     背景:

      在uboot中,start.s中涉及到了 CP15 的有关操作。查阅有关资料,进行学习。
        mrc p15, 0, r0, c1, c0, 0
        bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
        bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
        orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
        orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
        mcr p15, 0, r0, c1, c0, 0

    在基于ARM的嵌入式系统中,存储系统通常是通过系统控制协处理器CP15完成的。很多高级的寄存器并不能够直接访问。

    CP15可以包含16个32位的寄存器,其编号为0-15。

    实际上对于某些编号的寄存器可能对应有多个物理寄存器。在指令中指定特定的标志位来区分这些物理寄存器。

    有些类似于ARM寄存器中,处于不同的处理器模式时,ARM某些寄存器可能不同。

    在这里不对CP15各组寄存器做详细的分析,仅提供查阅的手段。

     
    MCR/MRC 用于系统存储管理的协处理器CP15,指令格式:
      MCR {cond}     coproc,opcode1,Rd,CRn,CRm,opcode2
      MRC {cond}     coproc,opcode1,Rd,CRn,CRm,opcode2

     *这2条指令仅适用于32位寄存器,因为64位寄存器仅由{CRm,opcode1}标识。

     
    <coproc>         指令操作的协处理器名,标准名为pn,n,为0~15 
    <opcode1>      协处理器的特定操作码,对于CP15寄存器来说,opcode1永远为0,不为0时,操作结果不可预知
     <Rd>    作为元寄存器的ARM寄存器。其值被读写到得协处理器寄存器中。
            <Rd>不能为PC, 当其为PC时。指令操作结果不可预知。
    <CRn>             存放第1个操作数的协处理器寄存器。
    <CRm>            存放第2个操作数的协处理器寄存器。    (用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为C0)
    <opcode2>      可选的协处理器特定操作码。                (用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为0)
     
    在明白了指令格式以后,我们记住了查阅有关的文档:《DDI0406C arm_architecture_reference_manual.pdf》。
     
     

     找到了对应的寄存器,STCLR

    结合文章开头中间那几行语句,发现这段代码是对于STCLR不同的位进行置位/清零。

     所以,整段代码做了这样的事情:

    1. 读取 SCTLR 的值到 R0

    2. 修改 对应的位

    3. 写回 SCTLR

     * 注意: 在操作CP15 有关寄存器时,可能要求权限等级在PL1

    文章完。

     
  • 相关阅读:
    BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
    BZOJ 1412 [ZJOI2009]狼和羊的故事 | 网络流
    BZOJ 2242 [SDOI2011]计算器 | BSGS
    BZOJ 2480 && 3239 && 2995 高次不定方程(高次同余方程)
    用JS制作博客页面背景随滚动渐变的效果
    BZOJ 3876 支线剧情 | 有下界费用流
    ZOJ 1314 Reactor Cooling | 上下界无源汇可行流
    BZOJ 百题纪念!
    BZOJ 3238 [Ahoi2013] 差异 | 后缀数组 单调栈
    BZOJ 4417 [Shoi2013]超级跳马
  • 原文地址:https://www.cnblogs.com/schips/p/11270256.html
Copyright © 2011-2022 走看看