【问题标题】:Unaligned memory access in ARM v7ARM v7 中未对齐的内存访问
【发布时间】:2011-12-20 11:08:11
【问题描述】:

您能否帮我编写代码(“C”或 ARM 程序集)将内存区域标记为“正常”,从而允许未对齐的内存访问?我知道我们需要在执行此操作之前启用 MMU。我是 ARM 架构的新手。

谢谢!

【问题讨论】:

    标签: arm armv7


    【解决方案1】:

    如果您只需要非对齐访问,请尝试将 cp15 sctlr[1](对齐位)设置为 0。

    mrc  p15, 0, r0, c1, c0, 0
    bic  r0, r0, #2
    mcr  p15, 0, r0, c1, c0, 0 
    

    我不知道是否需要为此启用 MMU。

    【讨论】:

      【解决方案2】:
      #define L1PoniterTo2ndLevelPageTable(BASE_ADDRESS, P, DOMAIN) (BASE_ADDRESS<<10U | P<<9U | DOMAIN<<5U | 1U)
      #define L1Section(BASE_ADDRESS, SBZ, NG, S, APX, TEX, AP, P, DOMAIN, XN, C, B) (BASE_ADDRESS<<20U | SBZ<<19 | 0U<<18U | NG<<17U | S<<16U | APX<<15U | TEX<<12U | AP<<10U | P<<9U | DOMAIN<<5U | XN<<4U | C<<3U | B<<2 |2U)
      #define L1SuperSection(BASE_ADDRESS, SBZ, NG, S, APX, TEX, AP, P, DOMAIN, XN, C, B) (BASE_ADDRESS<<24U | SBZ<<19 | 1U<<18U | NG<<17U | S<<16U | APX<<15U | TEX<<12U | AP<<10U | P<<9U | DOMAIN<<5U | XN<<4U | C<<3U | B<<2 |2U)
      
      unsigned long au32PageTableL1[4096U] __attribute__((aligned(0x4000)));
      //extern unsigned long _endof_consts[4096U];
      unsigned long u32EnableMMU()
      {
        unsigned long u32Index_l;
        unsigned long dummy;
        unsigned long sctlr;
      
        //create L1 page table
        for (u32Index_l=0;u32Index_l<sizeof(au32PageTableL1)/sizeof(au32PageTableL1[0]);u32Index_l++)
        {
          au32PageTableL1[u32Index_l] = L1Section
              (
              u32Index_l, //BASE_ADDRESS
              0b0, //SBZ
              0b0, //NG
              0b0, //S
              0b0, //APX
              0b001, //TEX
              0b11, //AP
              0b0, //P
              0,//DOMAIN
              0b0, //XN
              0b1, //C
              0b1 //B
              );
        }
      
        //set ttbr0
        __asm("MCR p15, 0, %0,       c2, c0, 0" : : "r" (au32PageTableL1));
      
        //invalidate TLB
        __asm("MCR p15, 0, %0,       c8, c3, 0" : : "r" (dummy));
      
        /* Ensure all TLB maintenance operations complete before returning. */
        __asm("dsb");
      
        //enable MMU
        __asm("MRC p15, 0, %0,       c1, c0, 0" : "=r" (sctlr));
        sctlr |= 1U;
        __asm("MCR p15, 0, %0,       c1, c0, 0" : : "r" (sctlr));
      
        return 0;
      }
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2011-07-04
      • 2019-01-02
      • 2010-11-07
      • 2013-10-21
      • 2014-06-25
      • 2013-05-09
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多