博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARM4412的MMU内存管理单元
阅读量:4603 次
发布时间:2019-06-09

本文共 2132 字,大约阅读时间需要 7 分钟。

由于在裸板驱动的时候要中断>>异常>>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("%x\n", *p);11  12 12  13     enable_mmu();13  14 14  15     unsigned long *r = (unsigned long *)0x30000000;15  16     printf("%x\n", *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("hahaha\n");47  48     __asm__ __volatile__(48  49         "mov r0, #3\n"49  50         "MCR p15, 0, r0, c3, c0, 0\n"50  51         "MCR p15, 0, %0, c2, c0, 0\n"51  52         "MCR p15, 0, %1, c1, c0, 0\n"52  53         :53  54         //输出54  55         : "r" (addr), "r" (mmu)55  56         //输入56  57         : "r0"57  58         //58  59     );59  60 }
View Code

 

转载于:https://www.cnblogs.com/hongzhunzhun/p/4501180.html

你可能感兴趣的文章
Eclipse插件项目中读取文件
查看>>
jquery定义链接跳转的高亮显示
查看>>
CheckListBox怎样得到多选值?
查看>>
2370 小机房的树
查看>>
三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
mysql 数据表操作 目录
查看>>
iOS常用第三方库 -转
查看>>
UVA 12546 - LCM Pair Sum
查看>>
HttpServletRequest对象方法的用法
查看>>
Android布局学习
查看>>
实时通讯与非实时通讯
查看>>
jQuery中事件绑定与解绑
查看>>
js原生Ajax的封装与使用
查看>>
周总结6
查看>>
PostgreSQL 务实应用(二/5)插入冲突
查看>>
一种公众号回复关键词机制
查看>>
java多线程入门学习(一)
查看>>
基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!
查看>>
nyist oj 138 找球号(二)(hash 表+位运算)
查看>>