系统引导时为什么要关闭Catchs?
一、引言
U-Boot 1.1.6中有如下代码:
/*
*************************************************************************
*
* CPU_init_critical registers
*
* setup important registers
* setup memory timing
*
*************************************************************************
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
* flush v4 I/D caches 关闭数据和指令缓存
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*
* disable MMU stuff and caches 关闭MMU
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0
/*
* before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.
*/
mov ip, lr //保存返回地址
在Linux 2.6.30.4中也有类似的代码
__arm920_setup:
mov r0, #0
mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4
#ifdef CONFIG_MMU
mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4
#endif
adr r5, arm920_crval
ldmia r5, {r5, r6}
mrc p15, 0, r0, c1, c0 @ get control register v4
bic r0, r0, r5
orr r0, r0, r6
mov pc, lr
二、系统引导时为什么要关闭Caches
从引言中我们可以看出,在U-Boot和Linux的引导阶段都关闭了Caches,这是为什么呢?
Caches是CPU内部的一个2级缓存,它的作用是将常用的数据和指令放在CPU内部。Caches是通过CP15管理的,刚上电的时候,CPU还不能管理Caches。上电的时候指令Cache可关闭,也可不关闭,但数据Cache一定要关闭,否则可能导致刚开始的代码里面,去取数据的时候,从Cache里面取,而这时候RAM中数据还没有Cache过来,导致数据预取异常 。
三、关键字Volatile
说到Caches就必须提到一个关键字Volatile,以后在设置寄存器时会经常遇到。它的本质:是告诉编译器不要对我的代码进行优化,作用是让编写者感觉变量的变化情况。
优化的过程:是将常用的代码取出来放到Caches中,它没有从实际的物理地址去取,它直接从CPU的缓存中去取,但常用的代码就是为了感觉一些常用变量的变化
优化原因:如果正在取数据的时候发生跳变,那么就感觉不到变量的变化了,所以在这种情况下要用Volatile关键字告诉编译器不要做优化,每次从实际的物理地址中去取指令,这就是为什么关闭Caches的原因。
但在C语言中是不会关闭Caches,会打开,如果编写者要感觉外界变化,或变化太快,从Caches中取数据会有误差,就加一个关键字Volatile。
分享到:
相关推荐
ecshop page caches 提高浏览速度
C:\Users\Administrator\.gradle\caches\jars-1\cache.properties (系统找不到指定文件)解决办法
Wiley.Load.Balancing.Servers.Firewalls.and.Caches.Feb.2002.rar
Linux的caches的分析,如何手工释放caches。
ecshop caches缓存 memcached 错误最新修正无错.txt ecshop caches缓存 memcached 错误最新修正无错.txt ecshop caches缓存 memcached 错误最新修正无错.txt
通过实验获得的真实数据记录与分析,Cache的大小对系统性能的影响。
该书对服务器、防火墙以及缓存等负载负载均衡从细枝末节进行了深入讲解
Future processors will likely have large on-chip caches with a possibility of dedicating an entire die for on-chip storage in a 3D stacked model. With the ever growing disparity between transistor and...
什么是NHibernate.Caches? NHibernate能够使用外部缓存插件来最小化对数据库的访问并提高性能。 NHibernate Contrib包含几个与不同的缓存服务器和框架一起使用的软件包。 建议先研究一段时间,然后再决定哪个更...
手工释放linux内存_procsysvmdrop_caches.pdf
INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS ...
python库。 资源全名:caches-0.2.12.tar.gz
Laravel开发-laravel-caches-cleaner Laravel控制台命令包,用于清除所有缓存并重新启动队列
2.安装出现temp/caches不可写提示:查看目录是否存在,不存在则创建,设置目录拥有读写权限 3.不能正常安装,一直停留在安装界面:可以直接导入install/xyo2o.sql,创建config/install.lock,更改config/config.php数据库...
esri的server中的Caches介绍
2.安装出现temp/caches不可写提示:查看目录是否存在,不存在则创建,设置目录拥有读写权限 3.不能正常安装,一直停留在安装界面:可以直接导入install/xyo2o.sql,创建config/install.lock,更改config/config.php数据库...
资源来自pypi官网。 资源全名:async-caches-0.3.0.tar.gz
CPU缓存以及您为什么要关心在我的macOS笔记本电脑上,我得到以下结果: [count_odds_row_major_traversal]avg = 52.22233msmid = 52.595066msmin = 50.999287msmax = 53.521421ms[count_odds_col_major_traversal]...
Caches是为精心设计的。 如何使用 缓存只能使用 。 缓存依赖于设置环境变量CACHES_DSN : caches.interface.Redis://localhost/0 如果要使用多个Redis服务器缓存内容,则实际上可以设置多个环境变量: export ...
一般大家在做大型工程的编译时,比如linux kernel,Android等总会遇到内存爆满,系统一旦开始刷新swap就奇慢无比,实际上是因为系统硬件内存部分被占满(其中大部分被载入内存中的文件已经不需要了——使用过了,...