<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARMv7的非對齊地址訪問

          作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          ARMv7默認(rèn)支持非對齊地址訪問,但有些條件:
          CP15 的系統(tǒng)控制寄存器(SCTLR), bit.A = 0, (bit.U = 1, 對于ARMv7已經(jīng)默認(rèn)置1了,不可改).
          訪問的地址空間必須為Normal memory, 訪問Device memory或Strongly memory都會(huì)引發(fā)alignment fault的Data Abort。而如果MMU disable的話,所有的memory都被當(dāng)作Strongly memory處理(這句話沒找到出處,來自ARM support回復(fù)的mail)。所以MMU必須enable,memory類型由頁表項(xiàng)的C, B, TEX[2:0]決定,這部分可以查閱 的:

          B3.7 Memory region attributes.

          本文引用地址:http://www.ex-cimer.com/article/201611/317217.htm
          示例
              MRS   r0, CPSR    ORR   r0, r0, #(PSR_I_BIT|PSR_F_BIT) ; Disable IRQ & FIQ    MSR   CPSR_c, r0; Disable MMU stuff and caches    MRC   p15, 0, r0, c1, c0, 0      ; read control register to r0    BIC   r0, r0, #0x000f         ; clear W(Write buffer), C(Cache), A(Align), M(MMU) bits    BIC   r0, r0, #0x1100         ; clear I(ICache), S(System protection) bits    MCR   p15, 0, r0, c1, c0, 0      ; write control register.        stack_setup    LDR   r0, =|Image$$ZI$$Limit|    ADD   r0, r0, #STACK_SIZE_SVC            MSR   CPSR_c, #(MODE_SVC :OR: PSR_F_BIT :OR: PSR_I_BIT)    MOV   sp, r0mmu_setup        LDR   r2, =MMU_TABLE_BASE               ; mmu page base address    MCR   p15, 0, r2, c2, c0, 0      ; write mmu page base address            BL   _cpu_mmu_init                LDR   r0, =0x89    LDRH  r1, [r0]

          關(guān)于編譯器

          在Realview下,如果目標(biāo)處理器選擇了ARMv6、ARMv7-A(如Cortex-A8)、ARMv7-R,編譯器的缺省選項(xiàng)是--unaligned_access, 而如果選擇了ARMv6以前的版本,或ARMv7-M體系的處理器,缺省選項(xiàng)是--no_unaligned_access。

          對于選項(xiàng)--no_unaligned_access,編譯器會(huì)自動(dòng)將C語言對非對齊地址的變量的訪問,轉(zhuǎn)化成若干個(gè)字節(jié)操作。 比如:

          __packed struct usb_endpoint_descriptor {  u8 bLength;  u16 wMaxPacketSize;  u8 bDescriptorType;  u8 bEndpointAddress;  u8 bmAttributes;  u8 bInterval;} ;int main(void){    volatile struct usb_endpoint_descriptor ep;   ep.wMaxPacketSize = 0x200;  while(1);  return 0;}如果--no_unaligned_access選項(xiàng)編譯,它的反匯編代碼如下:  main    0xe100c5f0:  e92d400c  .@-.  PUSH   {r2,r3,lr}    0xe100c5f4:  e3a00c02  ....  MOV   r0,#0x200    0xe100c5f8:  e5cd0001  ....  STRB   r0,[sp,#1]    0xe100c5fc:  e1a00420   ...  LSR   r0,r0,#8    0xe100c600:  e5cd0002  ....  STRB   r0,[sp,#2]     0xe100c604:  eafffffe  ....  B    0xe100c604 ; main + 20如果是--unaligned_access選項(xiàng)編譯,它的反匯編代碼如下:  main    0xe100c5f0:  e92d400c  .@-.  PUSH   {r2,r3,lr}    0xe100c5f4:  e3a00c02  ....  MOV   r0,#0x200    0xe100c5f8:  e1cd00b1  ....  STRH   r0,[sp,#1]     0xe100c5fc:  eafffffe  ....  B    0xe100c5fc ; main + 12

          如果你的目標(biāo)平臺(tái)是ARMv6或ARMv7-AR,但是在你的代碼中,MMU是disable的,那你應(yīng)該手動(dòng)添加編譯選項(xiàng)--no_unaligned_access,讓編譯器來幫你處理非對齊訪問。



          關(guān)鍵詞: ARMv7非對齊地址訪

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();