接着上一篇设置系统为SVC模式,关闭看门狗,关闭中断,下面就根据正对ok6410架构分析上的来关闭mmu和cache.虽说是重复造轮子,但对学习来说也是一种很好的方法,我要一步一步努力向上爬!
1. 先来介绍ARM的存储体系
从上到写依次存储访问速度下降,容量增大!同时价格也不是一个档次!
2. Cache简介:
Cache是一种容量小但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝,对于程序员来说,Cache是透明的,它自动决定保存那些数据、覆盖那些数据,按照功能划分
I-Cache: 指令Cache,用于存放指令
D-Cache: 数据Cache,用于存放数据
下面的一张截图显示有cache和没cache的区别!当没有cache时,处理器的高速和外设的低速会造成处理器资源的巨大浪费!所以Cache就诞生了!从上面的截图可以看出cache也是一种内存,但是比一般的内存访问速度更快!
Cache里面主要存放的是主存储器一些数据的拷贝!
这里看可以看到6410的Cache大小, 都是16KB
3. 虚拟地址(这个和MMU紧密相连)
概念:
虚拟地址:程序中使用的地址
物理地址:物理存储单元实际的地址
使用虚拟地址可以让进程使用更大的空间、可以解决冲突!(这个详细可以网上多了解一下虚拟地址的作用)
4. MMU的作用
将程序运行的硬件地址作为一个映射,然和一个程序可以使用的硬件地址为4G,32位的,但这里是uboot部分,初始化的时候还需要要配置才能使用,麻烦,所以初始化部分先关闭MMU(将虚拟地址转化为物理地址)
5. 和之前的一样,下面就来根据datasheet来理清思路如何关闭mmu和cache,然后用代码实现,手册比较多,这里截图只挑重点的说,这一篇还会和后边的博客程联系起来!
第一步:还是先找到MMU和Cache的控制寄存器
第二步:使I/Dcache失效
第三步: 关闭cache
打开ARM11核的芯片手册!搜索CP15,可以看到CP15里有个Control寄存器。
这个怎么设置基本上是按照手册上给的代码(手册上可以查到),这里在前面的基础上加上这一节的代码:
disable_mmu:
mcr p15,0,r0,c7,c7,0
mrc p15,0,r0,c1,c0,0
bic r0, r0, #0x00000007
mcr p15,0,r0,c1,c0,0
mov pc, lr