由于在裸板驱动的时候要中断>>异常>>MMU
MMU是一个内存管理单元,在CP15协处理器里面,而CP15处理器是嵌入在ARM芯片里。功能是将虚拟地址映射到物理地址里面。
在使用MMU寄存器机制之前首先要配置寄存器。将寄存器的功能打开
映射的机制支持段模式1M,小段模式,小页模式(更精细)
000000-------1000000 rom的地址
TLB虚拟地址与物理地址缓存的对应关系
页表的产生:假如将4个G的虚拟地址映射到1G的物理地址,假如有100个线程同时使用表,此时,建立的表的大小为:
4G*8*100=3200G。而此时将表放到内存中。。。。。。
但是将虚拟地址映射到物理的地址比如:将3000 0000地址映射到5000 0000的物理地址,此时可将虚拟地址分为高12位(基地址)和低20位(偏移地址),假如是3201 2345的虚拟地址映射到的物理5201 2345地址,此时只要映射基地值的值。只将320地址映射。而偏移地址的值存在对应的5000 0000+(基地值 * 4)这个地址里面。此时,只要使用2的12子方*4=16K。
这就是一级页表;
1 2 int (*printf)(char *, ...) = 0xc3e114d8;
2 3
3 4 void init_ttb(unsigned long *addr);
4 5 void enable_mmu(void);
5 6
6 7 int main()
7 8 {
8 9 unsigned long *p = (unsigned long *)0x50000000;
9 10 *p = 0x498afec0;
10 11 printf("%xn", *p);
11 12
12 13 enable_mmu();
13 14
14 15 unsigned long *r = (unsigned long *)0x30000000;
15 16 printf("%xn", *r);
16 17 }
17 18
18 19 void init_ttb(unsigned long *addr)
19 20 {
20 21 unsigned long va = 0;
21 22 unsigned long pa = 0;
22 23
23 24 for(va=0x30000000; va<=0x40000000; va+=0x100000){
24 25 pa = va + 0x20000000;
25 26 addr[va >> 20] = pa | 2;
26 27 }
27 28 for(va=0x40000000; va<=0x80000000; va+=0x100000){
28 29 pa = va;
29 30 addr[va >> 20] = pa | 2;
30 31 }
31 32 for(va=0x00000000; va<=0x14000000; va+=0x100000){
32 33 pa = va;
33 34 addr[va >> 20] = pa | 2;
34 35 }
35 36 }
36 37
37 38 void enable_mmu(void)
38 39 //配置mmu寄存器
39 40 {
40 41 unsigned long addr = 0x60000000;
41 42
42 43 init_ttb(addr);
43 44 //内存映射表,将
44 45 //0x30000000 => 0x50000000;
45 46 unsigned long mmu = 1 | (1 << 1) | (1 << 8);
46 47 printf("hahahan");
47 48 __asm__ __volatile__(
48 49 "mov r0, #3n"
49 50 "MCR p15, 0, r0, c3, c0, 0n"
50 51 "MCR p15, 0, %0, c2, c0, 0n"
51 52 "MCR p15, 0, %1, c1, c0, 0n"
52 53 :
53 54 //输出
54 55 : "r" (addr), "r" (mmu)
55 56 //输入
56 57 : "r0"
57 58 //
58 59 );
59 60 }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』