【发布时间】:2016-09-26 12:05:39
【问题描述】:
我正在尝试在树莓派 2 上运行一个裸机程序。我想设置缓存和 mmu,我参考了arm documentation。
首先,我使用 FASMARM 汇编器来编译我的代码。它可以在树莓派 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 汇编器可以编译的形式。但是,下面的代码无法在树莓派 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时出现问题,因为如果我注释掉启用mmu部分,代码可以工作。
有人可以帮帮我吗?
【问题讨论】:
标签: assembly arm raspberry-pi gnu fasm