ラズベリーパイ2のベアメタルプログラムを実行しようとしています。キャッシュとmmuを設定したいと思います。arm documentationを参照してください。armasmからgnuアームアセンブラへのARMセットアップキャッシュとmmu
まず、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アセンブラでコンパイルできる形式に変換する必要があります。私はMMUを有効にするセクションをコメントアウト場合は、以下のコードは、コードが動作することができますので、私は、問題はMMU有効にして発生するかどうかわからないんだけど、ラズベリーパイ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
上で動作することはできません。
誰でも助けてください。
GNUアセンブラは、デフォルトで統一構文を使用しているとは思われません。 –
@Ross確かに( 'ARM構文'の解析は非常に遅いので、ほとんどのUALも受け入れますが) '.syntax unified; mov r0、#0x5555'で '-march = armv7-a'を実行しても、" fixupの後に無効な定数(5555) "というエラーが出ます。 – Notlikethat