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

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

下面看看ARM存储体系:

可以看到速度最快的是处理器和内部寄存器,他们的数量很少,价格很昂贵。接着是TCM紧耦合存储器:cache和main memory。速度最慢的是外部存储介质:Flash和SD卡等。

CACHE:

上面是两种访存的两种机制,一种是处理器直接访问主存,另一种是处理器-cache-主存。第一种中,处理器的速度相比主存是非常快的,所以两者的速度很不匹配。浪费了处理器的很多资源。第二种是为了改进第一种的缺陷,在处理器和主存之间增加了一种叫Cache的原件,cache的访问速度比主存快,比处理器慢了点,这样就缓和了第一种的资源浪费现象。

其实在cache里存放的是主存的一些数据的拷贝:当处理器要访问主存里的数据的时候,处理器会先到cache里面找,如果里面没有想要的数据,再到主存里面访问,此时主存除了把数据总到处理器之外,他还拷贝一份数据到cache里。下一次处理器访问数据的时候,还是到cache里面找,如果有就直接取走。不用访问主存。有人做过统计,就是处理器会频繁使用某些数据,有些数据处理器很久才使用一次。这样就大大地提高了访问的速度了。

Cache是一种容量小但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝。对于程序员来说,Cache是透明的。它自动决定保存哪些数据、覆盖哪些数据。按照功能划分:

I-Cache: 指令Cache,用于存放指令

D-Cache:数据Cache,用于存放数据

2440的I/D-cache:

6410:

210:

虚拟内存:

假如一个程序员,编写了三个程序,都需要访问内存。而且操作系统中还有其他的应用程序。然而作为程序员,都是表层操作的,程序员都只是懂得软件的编写。他们怎么知道哪些物理地址被用了呢?他要使用哪些物理地址才不会冲突呢?最后很可能是两个应用程序访问同一个物理内存,就会产生地址冲突。还有就是实际的物理地址范围是很有限的。

但是引入了虚拟地址之后,程序员应用程序员不需要知道哪些物理地址被使用,因为他们使用的是虚拟地址。即使三个应用程序使用了同一个虚拟地址,最后系统会把这三个虚拟地址映射到不同的物理地址去执行。这样就不会产生冲突了。这样程序员使用的虚拟地址的范围比物理地址大了很多。

虚拟地址:程序使用的地址

物理地址:物理存储单元实际的地址

虚拟地址:

  1. 可以让进程使用更大的空间
  2. 可以解决冲突

那么谁来实现虚拟内存到物理内存的转换呢?这就是下面的MMU解决的问题了。

MMU的机制:

上面就是MMU的位置,完成虚拟地址到物理地址的转换。在上图结构看到cache在ARM11之前,cache是在MMU与处理器之间。ARM之后,cache是在MMU和Main memory之间。

要使用MMU和cache,这两个是必须学会使用的,这里把它关掉是我现在不用到MMU和cache,因为他们两的使用如果没有经过正确的配置,会出现一些意想不到的错误。所以这里先把他们关掉,免得出现影响裸机的学习。

2440的I、Dcache无效的设置:

首先进入ARM920t核手册ARM920T_TRM1_S.pdf,搜索CP15:

定位到2.3 CP15 register map summary

咋CP15里有一个control寄存器:

定位到该寄存器,可以看到它的访问方法read和write:

MRC p15, 0, Rd, c1, c0, 0 ; read control register

MCR p15, 0, Rd, c1, c0, 0 ; write control register

在这个寄存器中,怎么设置关闭I、Dcache和MMU,看下面control寄存器的参数:

从上图可以看到,控制I cache的是[12]位,该位设置为0就是disable I cache,1为使能。控制D cache的是[2]位,该位设置为0就是关闭D cache。第[0]位是控制MMU,设置为0是关闭,设置为1是使能。所以关闭I/D cache的工作就是设置上面三个位为0即可。

但是,在起初时,I/Dcache里面已经有了数据了的。所以我们还需要对它进行数据无效操作:

命令:

MCR p15,0,Rd,c7,c7,0

由上面的信息知道,关闭I/D cache和MMU的操作是:

  1. 使I/D cache和MMU无效:MCR p15,0,Rd,c7,c7,0
  2. 接着关闭I/D cache和MMU。

首先是使I/D cache和MMU无效,这里的通用寄存器选r2:

MCR p15,0,r2,c7,c7,0

关闭MMU和cache:

MRC p15,0,r2,c1,c0,0 @ read control register

bic r2,r2,#0x00000805 @0b100000000101=0x805

MCR p15,0,r2,c1,c0,0 @ write control register

最后的代码:

这里是2440的设置,6410和210也是一样的操作。前面提过他们三者的CP15是一样的。

6410:

MRC p15, 0, <Rd>, c1, c0, 0

MCR p15, 0, <Rd>, c1, c0, 0

MCR CP15,0,R1,C7,C10,0

210:

时间: 2024-07-31 14:28:40

26.核心初始化之关闭MMU和cache的相关文章

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.

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

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

关闭mmu和cache

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

核心初始化基本介绍

1.核心初始化主要工作 2.设置中断向量表 arm处理器支持7种类型的异常,如下表: 异常向量:当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量. 异常向量表:由七个异常向量及其处理函数跳转关系组成的表即为异常向量表. 3.设置svc模式 通过设置程序状态寄存器Current Program Status Register (CPSR) ,来设置模式. 步骤:先利用mrs将cpsr的值保持到通用寄存器中,清零相应5位(bic),

23.核心初始化之中断屏蔽-2440

23.核心初始化之中断屏蔽-2440 ? 在上一节中,我在设置关闭看门狗的时候,已经把WTCON的[2]设置为0,屏蔽了中断.如下图: 这一节是要屏蔽中断寄存器: 下面是2440芯片处理中断的机制: 中断屏蔽寄存器: ? 可以看到,只要把中断对应的中断屏蔽寄存器对应的位置为1即可.所以屏蔽中断就是往中断屏蔽寄存器置为全1,就屏蔽了所有中断. ? 编译: ? ?

ACE服务端编程4:ACE跨平台之运行时初始化和关闭

参考APG里的说法:平台差异及不兼容性的一个特别的方面,是对象的运行时初始化和程序关闭时这些对象的相应析构. ACE为了明确管理对象的清理,定义了ACE_Object_Manager类,这个类不仅涉及到对象的管理,还与ACE库的初始化与关闭相关. ACE中应用了大量的设计模式,本篇顺便研究ACE的程序入口函数替换机制分析. ACE库的初始化与关闭 应用要确保在使用ACE库时正确的初始化和关闭,有以下两种常用方式: 1.使用ACE_TMAIN宏作为程序入口函数: 2.使用ACE::init()和A

ORA-01033 ORACLE 正在初始化或关闭

(借鉴:该方法本人亲自操作过,解决了问题!) 解决连接ORACLE错误一例:ORA-01033: ORACLE 正在初始化或关闭 客户发现连接数据库有问题,错误有: ORA-01033: ORACLE 正在初始化或关闭 ORA-00600: 内部错误代码 首先修改环境变量,保证cmd下访问到正确的oracle监听,如: E:\oracle\product\10.2.0\client_1\bin;E:\oracle\product\10.2.0\client_2\bin;E:\oracle\pro

20.核心初始化之异常向量表

20.核心初始化之异常向量表 一.异常向量表: 包含:1.异常定义 ???? 2.异常类型 ???? 3.异常入口 ???? 4.向量表 首先异常定义,在ARM Architecture Reference Manual.pdf文档中,2.Programmers' Model的2.6.Exceptions异常: 异常:因为内部或外部的一些事件,导致处理器停下来正在处理的工作,转而去处理这些发生的事件. 2.异常类型 当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序

s3c2240核心初始化过程

一.目的:自己写一个简单的bootloader 二.过程:开发板上电后cpu立马从pc = 0出开始执行第一条指令,这时就需要进行一些必要的初始化 第一阶段: 1.建立异常向量表 2.关闭看门狗 3.屏蔽所有中断 4.初始化始终 5.初始化内存(sdram) 6.代码重定位 7.清除bss段 8.使用绝对指令跳转到c语音部分 第二阶段: 1.初始化串口 2.初始化nand flash 3.代码拷贝 原文地址:https://www.cnblogs.com/wangruo/p/9057100.ht