2016-05-28 3 views
0

Я пытаюсь запустить программу с открытым металлом на малине pi 2. Я хочу настроить кеш и mmu, и я ссылаюсь на arm documentation.Кэш настройки ARM и mmu от арматуры до ассемблера gnu arm

Во-первых, я использую ассемблер FASMARM для компиляции моего кода. Он может успешно работать на малине pi 2.

@;enable cache 
    @;Enables coherent requests to the processor 
    MRC p15, 0, r1, c1, c0, 1 
    ORR r1, r1, 0x40 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Disable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, #0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Disable L1 Caches 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, 0x1000 
    BIC r1, r1, 0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Invalidate Instruction cache 
    MOV r1, #0 
    MCR p15, 0, r1, c7, c5, 0 
    DSB 
    ISB 

    ;@ Invalidate Data cache 
    MRC p15, 1, r0, c0, c0, 0 
    MOV r3, 0x1ff 
    AND r0, r3, r0, LSR #13 
    MOV r1, #0 
way_loop: 
    MOV r3, #0 
set_loop: 
    MOV r2, r1, LSL #30 
    ORR r2, r2, r3, LSL #5 
    MCR p15, 0, r2, c7, c6, 2 
    ADD r3, r3, #1 
    CMP r0, r3 
    BGE set_loop 
    ADD r1, r1, #1 
    CMP r1, #4 
    BNE way_loop 
    DSB 
    ISB 

    ;@ Invalidate TLB 
    MCR p15, 0, r1, c8, c7, 0 
    DSB 
    ISB 

    ;@ Branch Prediction Enable 
    MOV r1, #0 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x800 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 

    ;@ Enable L1 Data prefetch control 
    MRC p15, 0, r1, c1, c0, 1 
    ORR r1, r1, 0x6000 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Initialize PageTable 
    MOV r0, 0xde2 
    MOV r1, 0x00004000 
    MOV r3, 0 
    ORR r2, r0, r3, LSL #20 
    STR r2, [r1] 
    BIC r0, r0, 0xc 
    ORR r0, r0, 0x4 
    BIC r0, r0, 0x7000 
    ORR r0, r0, 0x5000 
    ORR r0, r0, 0x10000 
    STR r0, [r1] 
    DSB 
    ISB 

    ;@ Initialize MMU 
    MOV r1, 0x0 
    MCR p15, 0, r1, c2, c0, 2 
    MOV r1, 0x00004000 
    MCR p15, 0, r1, c2, c0, 0 
    DSB 
    ISB 

    ;@ Set all Domains to Client 
    mov r1, 0x5555 
    movt r1, 0x5555 
    MCR p15, 0, r1, c3, c0, 0 
    DSB 
    ISB 

    ;@ Enable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable I cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x1000 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    @; end enable cache 

Мне нужно преобразовать код в форму, которая может быть скомпилирована сборщиком GNU. Тем не менее, приведенный ниже код не может работать на Raspberry Pi 2.

@; enable cache 
    @; Enables coherent requests to the processor 
    MRC p15, 0, r1, c1, c0, 1 
    orr r1, r1, #0x40 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Disable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, #0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 
    ;@ Disable L1 Caches 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, #0x1000 
    BIC r1, r1, #0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Invalidate Instruction cache 
    MOV r1, #0 
    MCR p15, 0, r1, c7, c5, 0 
    DSB 
    ISB 

    ;@ Invalidate Data cache 
    MRC p15, 1, r0, c0, c0, 0 
    LDR r3, =#0x1ff 
    AND r0, r3, r0, LSR #13 
    MOV r1, #0 
way_loop: 
    MOV r3, #0 
set_loop: 
    MOV r2, r1, LSL #30 
    ORR r2, r2, r3, LSL #5 
    MCR p15, 0, r2, c7, c6, 2 
    ADD r3, r3, #1 
    CMP r0, r3 
    BGE set_loop 
    ADD r1, r1, #1 
    CMP r1, #4 
    BNE way_loop 
    DSB 
    ISB 

    ;@ Invalidate TLB 
    MCR p15, 0, r1, c8, c7, 0 
    DSB 
    ISB 

    ;@ Branch Prediction Enable 
    MOV r1, #0 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x800 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable L1 Data prefetch control 
    MRC p15, 0, r1, c1, c0, 1 
    ORR r1, r1, #0x6000 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Initialize PageTable 
    LDR r0, =#0xde2 
    MOV r1, #0x00004000 
    MOV r3, #0 
    ORR r2, r0, r3, LSL #20 
    STR r2, [r1] 
    BIC r0, r0, #0xc 
    ORR r0, r0, #0x4 
    BIC r0, r0, #0x7000 
    ORR r0, r0, #0x5000 
    ORR r0, r0, #0x10000 
    STR r0, [r1] 
    DSB 
    ISB 

    ;@ Initialize MMU 
    MOV r1, #0x0 
    MCR p15, 0, r1, c2, c0, 2 
    MOV r1, #0x00004000 
    MCR p15, 0, r1, c2, c0, 0 
    DSB 
    ISB 

    ;@ Set all Domains to Client 
    LDR r1, =#0x5555 
    movt r1, #0x5555 
    MCR p15, 0, r1, c3, c0, 0 
    DSB 
    ISB 
    ;@ Enable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable I cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x1000 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

Я не уверен, возникает ли проблема в обеспечении чных, потому что код может работать, если я закомментируйте раздел включить MMU.

Может ли кто-нибудь помочь мне, пожалуйста?

ответ

1

Единственное, что выглядит, чтобы сделать возможную разницу есть использование буквенных нагрузок - так как ассемблер просто сбрасывает буквальный пул в конце файла, выполнение рискует работают прямо в данные:

... 
154: e3811a01  orr  r1, r1, #4096 ; 0x1000 
158: ee011f10  mcr  15, 0, r1, cr1, cr0, {0} 
15c: f57ff04f  dsb  sy 
160: f57ff06f  isb  sy 
164: 000001ff  .word 0x000001ff 
168: 00000de2  .word 0x00000de2 
16c: 00005555  .word 0x00005555 

для тех случаев, было бы лучше, чтобы преобразовать mov в явном movw, а не ldr=, чтобы избежать литералов полностью - ГАЗ, видимо, слишком глуп, чтобы понять, что единый синтаксис ожидает mov с 16-битным немедленная автоматическая выбор кодировки movw; Думаю, FASMARM делает это правильно.

+0

Я не думаю, что GNU Assembler по умолчанию использует унифицированный синтаксис. –

+0

@Ross действительно (хотя синтаксис синтаксиса ARM настолько слаб, что он по-прежнему принимает большую часть UAL), но даже «.syntax unified; mov r0, # 0x5555' с '-march = armv7-a' по-прежнему ошибки с« недопустимой константой (5555) после исправления »- я проверял! – Notlikethat