MMU粗页代码
来源:互联网 发布:淘宝主图尺寸 2017 编辑:程序博客网 时间:2024/04/28 01:38
最近几天稍微打算再把MMU的一些粗页代码写下,这个代码和上一次的段页映射都一样,都是一一映射,其他的映射关系也一样,区别就是这边用了二级映射关系,页面全部换成粗页,1024*4096个large page我也是醉了,不过我打算之后再弄得更细点,而且结构层次这次也分得不好,整个汇编代码冗余度也很高,感觉自己用汇编写个通用的函数还是太累了,不想把时间花在一个实验例程上。
0x0000 0000 ->0x0000 0000
.......
0xf000 0000 -> 0xf000 0000
0xb000 0000 ->GPIO口 0x5600 0000
0xc000 0000 ->led程序入口 0x3200 0000
0x0000 0000 ->0x0000 0000
.......
0xf000 0000 -> 0xf000 0000
0xb000 0000 ->GPIO口 0x5600 0000
0xc000 0000 ->led程序入口 0x3200 0000
////////////////////////////////////////////////
.equ MMU_COARSE_DOMAIN,( (0) <<5 )
.equ MMU_SPECIAL, ( (1) <<4 )
.equ MMU_COARSE_DESC, 0x01
.equ MMU_COARSE_NORMAL, ( MMU_COARSE_DOMAIN | MMU_SPECIAL | MMU_COARSE_DESC )
.equ COARSE_AP_0, ( (3) <<4 )
.equ COARSE_AP_1, ( (3) <<6 )
.equ COARSE_AP_2, ( (3) <<8 )
.equ COARSE_AP_3, ( (3) <<10 )
.equ COARSE_FULL_ACESS, ( COARSE_AP_0 | COARSE_AP_1 | COARSE_AP_2 | COARSE_AP_3 )
.equ COARSE_CACHE, ( (1) << 3)
.equ COARSE_BUFFER, ( (1) << 2)
.equ COARSE_DESC, (0x01)
.equ COARSE_NORMAL, ( COARSE_FULL_ACESS | COARSE_DESC)
.equ COARSE_WB, ( COARSE_NORMAL | COARSE_CACHE | COARSE_BUFFER)
.equ MMU_BASE_ADDR, 0x30200000
.equ COARSE_BASE_ADDR, 0x30200000+4096*4
.equ PA,0X00
.equ VA,0X00
.equ ENDPA,0xf0000000
start:
stmfd sp!,{r0-r12,lr}
begin:
mov r3,#0
ldr r5,=ENDPA
lsr r4,r5,#20
ldr r11,=MMU_BASE_ADDR
ldr r12,=COARSE_BASE_ADDR
forLoopI:
cmp r4,r3
bcc NEXT
mov r1,#4
mul r2,r1,r3
add r2,r2,r11
lsl r1,r3,#10
ldr r9,=MMU_COARSE_NORMAL
add r1,r1,r12
bic r1,r1,#0x0300
bic r1,r1,#0x00f0
bic r1,r1,#0x000f
orr r10,r1,r9
str r10,[r2]
J_begin:
mov r5,#0
mov r7,#16
mov r8,#0
forLoopJ:
cmp r7,r5
bcc END_R8
mov r6,#4
mul r9,r6,r5
add r2,r1,r9
mov r6,#64
mul r9,r6,r8
add r2,r2,r9
lsl r6,r3,#20
mov r10,r6
lsl r6,r8,#16
add r10,r10,r6
mov r6,r10
ldr r10,=COARSE_NORMAL
orr r10,r6,r10
str r10,[r2]
add r5,r5,#1
b forLoopJ
END_R8:
cmp r7,r8
bcc END_I
mov r5,#0
add r8,r8,#1
b forLoopJ
END_I:
add r3,r3,#1
b forLoopI
NEXT:
.equ LED_ADR,0xb0000000
.equ LED_P_ADDR,0x56000000
.equ LED_BIN,0xc0000000
.equ LED_P_BIN,0x32000000
ldr r1,=LED_ADR
ldr r2,=LED_P_ADDR
ldr r3,=LED_BIN
ldr r4,=LED_P_BIN
lsr r5,r1,#20
mov r6,#4
mul r7,r6,r5
add r6,r7,r11
ldr r7,[r6]
bic r7,r7,#0x300
bic r7,r7,#0x0f0
bic r7,r7,#0x00f
lsl r5,r1,#22
lsr r5,r5,#24
lsl r5,r5,#2
orr r6,r7,r5
ldr r7,=LED_P_ADDR
bic r7,r7,#0xf000
bic r7,r7,#0x0f00
bic r7,r7,#0x00f0
bic r7,r7,#0x000f
ldr r8,=COARSE_NORMAL
orr r9,r7,r8
str r9,[r6]
BIN:
lsr r5,r3,#20
mov r6,#4
mul r7,r6,r5
add r6,r7,r11
ldr r7,[r6]
bic r7,r7,#0x300
bic r7,r7,#0x0f0
bic r7,r7,#0x00f
lsl r5,r3,#22
lsr r5,r5,#24
lsl r5,r5,#2
orr r6,r7,r5
ldr r7,=LED_P_BIN
bic r7,r7,#0xf000
bic r7,r7,#0x0f00
bic r7,r7,#0x00f0
bic r7,r7,#0x000f
ldr r8,=COARSE_NORMAL
orr r9,r7,r8
str r9,[r6]
START_MMU:
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c7, c10, 4
mcr p15, 0, r0, c8, c7, 0
ldr r4,=MMU_BASE_ADDR
mcr p15, 0, r4, c2, c0, 0
mvn r0, #0
mcr p15, 0, r0, c3, c0, 0
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x3000
bic r0, r0, #0x0300
bic r0, r0, #0x0087
orr r0, r0, #0x0002
orr r0, r0, #0x0004
orr r0, r0, #0x1000
orr r0, r0, #0x0001
mcr p15, 0, r0, c1, c0, 0
return:
ldmfd sp!,{r0-r12,pc}
0 0
- MMU粗页代码
- mmu小页代码
- S3C2410 MMU 代码
- IA32 MMU paging初始化代码
- MMU
- MMU
- MMU
- MMU
- MMU
- MMU
- MMU
- MMU
- MMU
- MMU
- mmu
- MMU
- MMU
- MMU
- bzoj 3931: [CQOI2015]网络吞吐量
- POJ 1064 Cable master
- OpenJDK类加载实现浅析#3:并行加载
- Linux中写个简单的网卡驱动程序
- James邮件服务器简单介绍及配置发送外网邮件【转】
- MMU粗页代码
- mmu小页代码
- 操作系统原理第二周:操作系统运行环境
- 集合1——Collection集合
- spring入门5-annotation自动注入
- Javascript对象 Object 与函数 Function
- [BZOJ 2588][SPOJ COT]Count On a Tree(DFS序主席树)
- 一步一步学习多线程编程之线程同步通信
- java常用数据结构类图