u-boot-1.1.6中关于ARM920T协处理器操作的分析
来源:互联网 发布:淘宝日用杂货铺 编辑:程序博客网 时间:2024/05/18 03:59
http://haoyeren.blog.sohu.com/88148409.html
最近在分析u-boot-1.1.6的源码,同时为自己的移植做准备。其实本来不用研究这么细,但是为了借机提高一下自己的硬件水平,所以不得不为之。
在分析u-boot-1.1.6源码的时候,发现对协处理器的操作比较复杂,在网上搜的资料也不太全,而且S3C2440的文档里没有,后来去ARM公司的网站上,下载了ARM920T核心的说明文档,才大概搞清楚是怎么回子事。我觉得这块比较重要,就先发出来。
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
/*MCR与MRC是对ARM处理器的协处理器进行操作的指令,要搞清楚这里对协处理器进行设置的操作,必须查ARM公司的关于ARM920T核心的说明文档,三星的S3C2440的文档里没有相关的资料。
这里的这两个指令比较特殊,其各种参数都是有特殊值的,并不能乱写,一切只能查表来得到。
经过查表,关于MCR p15,0,Rd,c7,c7,0的操作是:Invalidate ICache and DCache|SBZ|MCR p15,0,Rd,c7,c7,0
也就是说,这句指令的操作是让ICache与DCache无效的操作,这两个,一个是指令缓存器,另一个是数据缓存器
其中有一个地方要注意,就是对Rd的说明,是SBZ,这个是Should Be Zero的简写,在ARM920T的说明文档里,可以查到具体的意思,意思就是需要这个寄存器里所有的位都为0
所以就不难解释为什么第一句语句是mov r0, #0了
*/
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*
这条语句,经过查询,意义为:Invalidate TLB(s)|SBZ|MCR p15,0,Rd,c8,c7,0
即让TLB无效
什么是TLB呢?TLB是Translation Lookaside Buffers的简称,这里的Translation就是指地址译码的动作,可能翻译成“地址转换遍历缓存”。其实地址缓存机制是因为有MMU,即内存管理单元(Memory Management Unit)才有的。
这种机制具体是怎么回事,有兴趣的可以自己看一看ARM920T核心的说明文档
这里既然使地址转换无效了,那么下一步肯定是要关掉CPU的MMU了,要不一会儿,就又生效了。
*/
/*
* disable MMU stuff and caches
*/
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
/*
在ARM920T核心的说明文档中,可以查到如下的信息:
MRC p15, 0, Rd, c1, c0, 0 ; read control register
MCR p15, 0, Rd, c1, c0, 0 ; write control register
而且这些说明是放在Register 1, control register这一章的,那么就可以说明,这里的MRC与MCR语句是操作协处理器的Register 1的。
就像在前面说的,BIC是位清除,ORR是位置1,所以执行完第一句mrc p15, 0, r0, c1, c0, 0后,r0寄存器内的值就是Register 1的值。
0x00002300 = 10001100000000(BIN),第8,9,13位被清零,即S,R,V位被清零。经过查ARM920T核心说明文档中的表,得知S,R被清零,表示任何对MMU的访问操作,都会产生域失败(domain fault)。V被清零,表示Base location of exception registers的地址,从0x0开始。
0x00000087 = 10000111(BIN),第0,1,2,7位被清零。即M,A,C,B被清零,分别表示MMU Disabled,Data address alignment fault checking,Fault checking disabled。DCache disabled。Little-endian operation。
0x00000002 = 10(BIN),即第1位置1,表示又把相应的模式设置成了Data address alignment fault checking,Fault checking enabled状态。不太明白为什么在上一句给清空了,这句又给置上了。
0x00001000 = 1000000000000,即第12位置1,表示可以打开ICache,即打开指令缓存。
然后mcr p15, 0, r0, c1, c0, 0就是把相应的位操作结果写到Register 1里,使其生效。
我想这里把原本可以合并的两个bic与orr操作分开,很可能是在按照某种规范操作,或是步骤来执行,虽然执行结果一样。如果这个理解不对,请知道的同志指正,因为没有太多精力研究得很细了。
*/
- u-boot-1.1.6中关于ARM920T协处理器操作的分析
- u-boot-1.1.6中关于ARM920T协处理器操作的分析
- U-Boot中ARM协处理器CP15的操作分析
- U-Boot(arm920t/start.S)中重要代码分析
- 分析 u-boot 的第一阶段代码(cpu/arm920t/start.S)
- ARM920T的CP15协处理器
- ARM920T协处理器以及MMU的分析(一)
- ARM920T协处理器以及MMU的分析(二)
- ARM920T协处理器以及MMU的分析(三)
- ARM920T MMU and Cache ——PART3 ARM920T的CP15协处理器
- u-boot 中board.c的分析
- U-BOOT中SDRAM的初始化分析
- u-boot-2014.04 arm/arm920t/start.S
- 对/u-boot-1.1.6/board/smdk2410/u-boot.lds的更详细的分析
- 对/u-boot-1.1.6/board/smdk2410/u-boot.lds的更详细的分析
- 对/u-boot-1.1.6/board/smdk2410/u-boot.lds的更详细的分析
- u-boot关于u-boot的理解
- u-boot-1.1.6中.lds连接脚本文件的分析
- linux移植到window相关的函数
- Objective-c NSString 转utf-8和gb2312
- android 常用action
- ACM基本算法分类、推荐学习资料和配套pku习题
- C#中获取Excel文件的第一个表名
- u-boot-1.1.6中关于ARM920T协处理器操作的分析
- 在ubuntu下动手编译arm-elf工具
- 算法导论CLRS 2.1 插入排序
- Xcode4如何添加Frameworks
- paip.读取WEB.XML中的参数值总结
- C#获取EXCEL所有表名
- 苹果开发者帐号(Company)申请流程
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-6-25日更新iap恢复详解】
- 数论之不用除法运算,如何实现A/3