您的位置 首页 模拟

ARMv7的非对齐地址拜访

ARMv7默认支持非对齐地址访问,但有些条件:CP15的系统控制寄存器(SCTLR),bit.A=0,(bit.U=1,对于ARMv7已经默认置1了,不可…

ARMv7默许支撑非对齐地址拜访,但有些条件:
CP15 的系统控制寄存器(SCTLR), bit.A = 0, (bit.U = 1, 关于ARMv7现已默许置1了,不行改).
拜访的地址空间有必要为Normal memory, 拜访Device memory或Strongly memory都会引发alignment fault的Data Abort。而假如MMU disable的话,一切的memory都被当作Strongly memory处理(这句话没找到出处,来自ARM support回复的mail)。所以MMU有必要enable,memory类型由页表项的C, B, TEX[2:0]决议,这部分能够查阅 的:

B3.7 Memory region attributes.

示例

    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]

关于编译器

在Realview下,假如方针处理器挑选了ARMv6、ARMv7-A(如Cortex-A8)、ARMv7-R,编译器的缺省选项是–unaligned_access, 而假如挑选了ARMv6曾经的版别,或ARMv7-M系统的处理器,缺省选项是–no_unaligned_access。

关于选项–no_unaligned_access,编译器会主动将C语言对非对齐地址的变量的拜访,转化成若干个字节操作。 比方:

__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选项编译,它的反汇编代码如下:  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选项编译,它的反汇编代码如下:  main    0xe100c5f0:  e92d400c  .@-.  PUSH   {r2,r3,lr}    0xe100c5f4:  e3a00c02  ....  MOV   r0,#0x200    0xe100c5f8:  e1cd00b1  ....  STRH   r0,[sp,#1]     0xe100c5fc:  eafffffe  ....  B    0xe100c5fc ; main + 12

假如你的方针渠道是ARMv6或ARMv7-AR,可是在你的代码中,MMU是disable的,那你应该手动增加编译选项–no_unaligned_access,让编译器来帮你处理非对齐拜访。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/275649.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部