u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗

u-boot分析(五)

  上篇博文我们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天我们继续按照u-boot的启动流程对以下内容进行分析。

今天我们会用到的文档:

  1. Arm9内核手册:http://download.csdn.net/detail/wrjvszq/8358867
  2. Arm11内核手册:http://download.csdn.net/detail/wrjvszq/8358877
  3. Arm a8内核手册:http://download.csdn.net/detail/wrjvszq/8358893
  4. 2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949
  5. 6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965
  6. 210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)

今天我们将会分析以下内容:

1.      让L1的I/D cache失效

2.      关闭MMU和cache

3.      关闭看门狗

L1I/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失效了。

1 mcr p15, 0, r0, c7, c5, 0//让cache失效

注:在u-boot中这一部分代码还失效了别的东西,我们这里就不关注了。

关闭MMUcache

1.       什么是MMU

MMU就是负责虚拟地址(virtual address)转化成物理地址(physical address)。

在这里肯定有人跟我一样的疑惑,既然有物理地址我们访问的时候访问物理地址不就完事了吗?为什么要有虚拟地址的存在,然后还要加个专门的硬件去转换,这就是多此一举吗?

其实加入了虚拟地址后有下面两个作用

1)        虚拟内存:有了虚拟内存,可以在处理器上运行比实际物理内存大的应用程序。

2)        内存保护:根据需要对特定的内存区块的访问进行保护,通过这一功能,我们可以将特定的内存块设置成只读、只写或是可同时读写。

2.       为什要关闭MMU

跟cache的原因一样,在使用MMU之前要进行一系列的初始化,并且过程比较复杂,现在用不到所以要关闭它。

3.       怎么关闭MMU

同样在刚才的寄存器列表中我们可以找到一个Control Register 我们重点关注一下它的下面几个位

从上图我们可以看到,我们只要将这个寄存器的0、2、12、位设置为零就可以关闭我们的cache和MMU了。

那么如何设置呢,我们稍微往下找找就可以找到

我们先要将里面的数据读出来,经过处理后在写入。所以就不难理解u-boot的代码了

 1             mrc p15, 0, r0, c1, c0, 0
 2
 3             bic  r0, r0, #0x00002000   @ clear bits 13 (--V-)
 4
 5             bic  r0, r0, #0x00000007   @ clear bits 2:0 (-CAM)
 6
 7             orr r0, r0, #0x00000002   @ set bit 1 (--A-) Align
 8
 9             orr r0, r0, #0x00000800   @ set bit 11 (Z---) BTB
10
11            #ifdef CONFIG_SYS_ICACHE_OFF
12
13             bic  r0, r0, #0x00001000   @ clear bit 12 (I) I-cache
14
15 #else
16
17             orr r0, r0, #0x00001000   @ set bit 12 (I) I-cache
18
19 #endif
20
21             mcr p15, 0, r0, c1, c0, 0

注:我们重点关注我们刚才提到的几个是不是为零即可

接着流程往下,我们应该是检查reset状态和恢复IO引脚为默认值了,由于这两部分不是很重要的初始化,所以我们在此就跳过了,在往下就应该到关闭看门狗了

关闭看门狗

1.       什么是看门狗

看门狗的用途是使微控制器在进入错误状态后(死机)的一定时间内复位。当看门狗使能时,如果用户程序没有在周期时间内喂狗(重装),看门狗会产生一个系统复位。

2.       看门狗原理解析

我们在每个芯片的芯片手册中都可以找到下图:

1)        PCLK经过预分频器以及选择器以后会产生看门狗时钟,然后通过计数逻辑模块,开始计数。

2)        WTDAT是预先存放的计数初值,WTCNT是减量计数模块,当WTCNT从WTDAT的值减到0的时候,如果还没有更新WTDAT,则认为没有喂狗,系统死机。

3)        发出reset  信号,强制系统重启

3.       为什么要关看门狗

1)        要一直喂狗麻烦

2)        普遍认为bootloader代码较少,不需要看门狗。

4.       怎么关闭看门狗

在芯片手册中我们可以轻松的找到WTCON寄存器

通过上面寄存器的介绍,我们可以知道向其最低位写入0可关闭,其复位,想第二位写入0可关闭中断,索性我们之间写入0就完事,所以也就不难理解u-boot中的代码了

1 /* Disable Watchdog */
2
3
4
5       ldr  r0, =ELFIN_WATCHDOG_BASE /* 0xE2700000 */
6
7       mov     r1, #0
8
9        str  r1, [r0]
时间: 2024-11-08 03:53:15

u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗的相关文章

[国嵌笔记][036][关闭MMU和CACHE]

关闭MMU和CACHE 1.Cache是一种容量小,但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝.按功能分为ICache(指令Cache)和DCache(数据Cache) 2.虚拟地址就是程序中使用的地址:物理地址就是物理存储单元中实际使用的地址.虚拟地址可以让进程使用更大的空间.MMU的作用就是完成虚拟地址到物理地址的转换 3.在处理器初始化阶段,为防止意想不到的错误,需要暂时关闭MMU和Cache 4.MMU和Cache都是通过CP15协处理器的R1(control regi

26.核心初始化之关闭MMU和cache

26.核心初始化之关闭MMU和cache 下面看看ARM存储体系: 可以看到速度最快的是处理器和内部寄存器,他们的数量很少,价格很昂贵.接着是TCM紧耦合存储器:cache和main memory.速度最慢的是外部存储介质:Flash和SD卡等. CACHE: 上面是两种访存的两种机制,一种是处理器直接访问主存,另一种是处理器-cache-主存.第一种中,处理器的速度相比主存是非常快的,所以两者的速度很不匹配.浪费了处理器的很多资源.第二种是为了改进第一种的缺陷,在处理器和主存之间增加了一种叫C

关闭mmu和cache

处理器内部寄存器,访问速度最快,但是数量少 TCM:紧耦合存储器(Cache.主存储器) 辅助存储器(Flash.SD等) Cache是一种容量小但是存取速度非常快的存储器 它保存最近用到的存储器中的数据的拷贝,对于程 序员来说,Cache是透明的,他自动决定保存哪些 数据.覆盖哪些数据.按照功能划分: I-cache:指令Cache D-cache:数据Cache 虚拟地址:程序中使用的地址 物理地址:物理存储单元的实际的地址 虚拟地址可以解决地址冲突,可以是进程使用更大的空间 1.使Icac

Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个 Demo 来试试它的效果,越简单越容易上手最好.在网上找相关资料的时候总是很麻烦,有的文章写的挺不错的但是没有源代码,有的有源代码但是文章介绍又不是很清楚,所在找资料的时候稍微有点费劲.因此在我学习 Spring Boot 的时候,会写一些最简单基本的示例项目,一方面方便其它朋友以最快的方式去了解,一方面如果我的项目需要用到相

spring boot(十五)spring boot+thymeleaf+jpa增删改查示例

快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.

传奇源码分析-客户端(游戏逻辑处理源分析五 服务器端响应)

器执行流程:(玩家走动) GameSrv服务器ProcessUserHuman线程处理玩家消息:遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.判断玩家if (!m_fIsDead),如果已死,则发送_MSG_FAIL消息.我们在前面看到过,该消息是被优先处理的.否则则调用WalkTo,并发送_MSG_GOOD消息给客户端.Walk

IE IE8 iframe的onload方法分析 IE浏览器onload事件失效

判断iframe是否加载完成的完美方法 IE 支持 iframe 的 onload 事件,不过是隐形的,需要通过 attachEvent 来注册. 第二种方法比第一种方法更完美(采用readystatechange判断),因为 readystatechange 事件相对于 load 事件有一些潜在的问题. 这里感觉说的并不是完全准确,开始给我造成了很大的困扰.看其代码才明白,真正意义上来讲IE在创建一个新的iframe时的onload方法需要使用attachEvent来绑定,而原来就存在的ifr

baksmali和smali源码分析(五)

官方文档对于dex中的class数据结构表示如下: class_idx uint index into the type_ids list for this class. This must be a class type, and not an array or primitive type. access_flags uint access flags for the class (public, final, etc.). See "access_flags Definitions&quo

Nouveau源码分析(五):NVIDIA设备初始化之nouveau_drm_load (2)

Nouveau源码分析(五) 接着上一篇来,先把nouveau_drm_load再贴出一遍来吧: // /drivers/gpu/drm/nouveau/nouveau_drm.c 364 static int 365 nouveau_drm_load(struct drm_device *dev, unsigned long flags) 366 { 367 struct pci_dev *pdev = dev->pdev; 368 struct nouveau_drm *drm; 369 i