u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗
u-boot分析(五)
上篇博文我们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天我们继续按照u-boot的启动流程对以下内容进行分析。
今天我们会用到的文档:
- Arm9内核手册:http://download.csdn.net/detail/wrjvszq/8358867
- Arm11内核手册:http://download.csdn.net/detail/wrjvszq/8358877
- Arm a8内核手册:http://download.csdn.net/detail/wrjvszq/8358893
- 2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949
- 6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965
- 210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)
今天我们将会分析以下内容:
1. 让L1的I/D cache失效
2. 关闭MMU和cache
3. 关闭看门狗
l 让L1的I/D cache失效
1. 什么是cache
Cache 是位于 CPU与主存储器DRAM之间的少量超高速静态存储器 SRAM(static RAM),其是为了解决 CPU 与主存之间速度匹配问题而设置的。
Cache又分为I-cache(用来存指令)和D-cache(用来存数据)
2. 为什么要让cache失效
我们在使用cache的时候要经过一系列的配置,在没配置之前是不能使用的。所以我们要关闭cache,但是在关闭cache之前cache里面可能已经有数据了,为了不影响我们的代码,所以要先让其失效,在进行关闭。
3. 怎么让cache失效
根据A8内核手册中的3.2.1Register allocation一节我们找到了其对CP15协处理器的寄存器的简介,我们仔细阅读其对所有寄存器的说明可以找到下面的表

那么怎么去设置这个寄存器呢,我们稍微看看文档就会发现下面东西

所以我们让cache失效的代码就很简单了,通过下面的指令就可以让cache失效了。
mcr p15, , r0, c7, c5, //让cache失效
注:在u-boot中这一部分代码还失效了别的东西,我们这里就不关注了。
l 关闭MMU和cache
1. 什么是MMU:
MMU就是负责虚拟地址(virtual address)转化成物理地址(physical address)。
在这里肯定有人跟我一样的疑惑,既然有物理地址我们访问的时候访问物理地址不就完事了吗?为什么要有虚拟地址的存在,然后还要加个专门的硬件去转换,这就是多此一举吗?
其实加入了虚拟地址后有下面两个作用
1) 虚拟内存:有了虚拟内存,可以在处理器上运行比实际物理内存大的应用程序。
2) 内存保护:根据需要对特定的内存区块的访问进行保护,通过这一功能,我们可以将特定的内存块设置成只读、只写或是可同时读写。
2. 为什要关闭MMU
跟cache的原因一样,在使用MMU之前要进行一系列的初始化,并且过程比较复杂,现在用不到所以要关闭它。
3. 怎么关闭MMU
同样在刚才的寄存器列表中我们可以找到一个Control Register 我们重点关注一下它的下面几个位

从上图我们可以看到,我们只要将这个寄存器的0、2、12、位设置为零就可以关闭我们的cache和MMU了。
那么如何设置呢,我们稍微往下找找就可以找到

我们先要将里面的数据读出来,经过处理后在写入。所以就不难理解u-boot的代码了
mrc p15, , r0, c1, c0,
bic r0, r0, #0x00002000 @ clear bits (--V-)
bic r0, r0, #0x00000007 @ clear bits : (-CAM)
orr r0, r0, #0x00000002 @ set bit (--A-) Align
orr r0, r0, #0x00000800 @ set bit (Z---) BTB
#ifdef CONFIG_SYS_ICACHE_OFF
bic r0, r0, #0x00001000 @ clear bit (I) I-cache
#else
orr r0, r0, #0x00001000 @ set bit (I) I-cache
#endif
mcr p15, , r0, c1, c0,
注:我们重点关注我们刚才提到的几个是不是为零即可
接着流程往下,我们应该是检查reset状态和恢复IO引脚为默认值了,由于这两部分不是很重要的初始化,所以我们在此就跳过了,在往下就应该到关闭看门狗了
l 关闭看门狗
1. 什么是看门狗
看门狗的用途是使微控制器在进入错误状态后(死机)的一定时间内复位。当看门狗使能时,如果用户程序没有在周期时间内喂狗(重装),看门狗会产生一个系统复位。
2. 看门狗原理解析
我们在每个芯片的芯片手册中都可以找到下图:

1) PCLK经过预分频器以及选择器以后会产生看门狗时钟,然后通过计数逻辑模块,开始计数。
2) WTDAT是预先存放的计数初值,WTCNT是减量计数模块,当WTCNT从WTDAT的值减到0的时候,如果还没有更新WTDAT,则认为没有喂狗,系统死机。
3) 发出reset 信号,强制系统重启
3. 为什么要关看门狗
1) 要一直喂狗麻烦
2) 普遍认为bootloader代码较少,不需要看门狗。
4. 怎么关闭看门狗
在芯片手册中我们可以轻松的找到WTCON寄存器

通过上面寄存器的介绍,我们可以知道向其最低位写入0可关闭,其复位,想第二位写入0可关闭中断,索性我们之间写入0就完事,所以也就不难理解u-boot中的代码了
/* Disable Watchdog */
ldr r0, =ELFIN_WATCHDOG_BASE /* 0xE2700000 */
mov r1, #
str r1, [r0]
u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗的更多相关文章
- [国嵌笔记][036][关闭MMU和CACHE]
关闭MMU和CACHE 1.Cache是一种容量小,但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝.按功能分为ICache(指令Cache)和DCache(数据Cache) 2.虚拟地址 ...
- 关闭mmu和cache
处理器内部寄存器,访问速度最快,但是数量少 TCM:紧耦合存储器(Cache.主存储器) 辅助存储器(Flash.SD等) Cache是一种容量小但是存取速度非常快的存储器 它保存最近用到的存储器中的 ...
- (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...
- Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个 Demo 来试试它的效果,越 ...
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- spring boot(十五)spring boot+thymeleaf+jpa增删改查示例
快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...
- Spring全家桶之spring boot(五)
Thymeleaf简介 Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#.PHP语言体系下也 ...
- phpcms 源码分析五:文件缓存实现
这次是逆雪寒的文件缓存实现代码分析: /* [/php] PHPCMS的文本缓存实现: [php] <?php /* 这个文件里面全是有关生成文本缓存的函数.文本缓存是个好东西.一般的项目,我们 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析五
手机自动化测试:Appium源码分析之跟踪代码分析五 手机自动化测试是未来很重要的测试技术,作为一名测试人员应该熟练掌握,POPTEST举行手机自动化测试的课程,希望可以训练出优秀的手机测试开发工 ...
随机推荐
- CF580C Kefa and Park dfs
Kefa decided to celebrate his first big salary by going to the restaurant. He lives by an unusual pa ...
- SPI 实现原理及运用
SPI原理 SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的.在java.util.ServiceLoader的文档里有比较详 ...
- Qt 学习之路 2(19):事件的接受与忽略
Home / Qt 学习之路 2 / Qt 学习之路 2(19):事件的接受与忽略 Qt 学习之路 2(19):事件的接受与忽略 豆子 2012年9月29日 Qt 学习之路 2 140条评论 ...
- c语言定义指针类型需注意事项
1)在定义说明语句中,指针变量名之前的星号“*“是指针变量的修饰符,也就是说它所修饰的变量是指针变量. 2)指针变量是用它们所指向的对象类型来区分的.如定义 int *ip,类型int并不是指针的类型 ...
- phpSpreadSheet 中 使用的 一些坑
如果是upupw,它 做了 安全限制...将 上传目录 写成 uploadfiles 等 才能 写进去.. 文件路径 也不要有 中文..很有可以能 下载时 找不到路径....这个太坑...
- P2421 [NOI2002]荒岛野人
传送门 答案不大于 $10^6$,考虑枚举答案 对于枚举的 ans,必须满足对于任意 i,j(i≠j) 都有 使式子$c_i+kp_i \equiv c_j+kp_j\ (mod\ ans)$成立的最 ...
- UVA11082 行列模型
行列二分图模型,行指向列即表示权重w[i][j] 避免零流的方法就是使下界为1 #include<bits/stdc++.h> #define rep(i,j,k) for(int i = ...
- xpath的基础使用
一.xpath简介 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...
- node js fcoin api 出现 api key check fail : {"status":1090,"msg":"Illegal API signature"}
//主区://ft / btc 不支持市价 买入数量不能小于5个FT 买//ft / eth 支持市价 最小买入eth不能小于0.01 买//ft / usdt 支持市价 最小买入usdt不能小于10 ...
- 「linux」后台启动nohup经常跟的>/dev/null 2>&1是什么意思
https://www.cnblogs.com/wangsongbai/p/10215155.html 我们在写启动脚本的时候,会用nohup &,这个大家都知道,但是经常会有 >/de ...