u-boot-1.1.6中关于ARM920T协处理器操作的分析

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操作分开,很可能是在按照某种规范操作,或是步骤来执行,虽然执行结果一样。如果这个理解不对,请知道的同志指正,因为没有太多精力研究得很细了。
 */



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值