26375|87

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2008年最后一帖——了结MMU和cache(顺便纠正以前的错误) [复制链接]

这两天,重新看了MMU和cache,对它有了一点了解,现在再把疑问放到论坛上来,希望大家帮忙(前几天参与押宝,现在分数还没有回来,没有分发帖了,以后有分再补回吧,sorry)
——————————————————————————————————————
我看了的ADS bootloader部分,发现一个很奇怪的问题,它居然只是对一级页表做了配置,并且把虚拟内存和物理内存映射成相等
不知道为什么会这样。这不是多此一举吗?

看如下代码(三星提供)

  1. /************************************************
  2.   NAME    : MMU.C
  3.   DESC          :
  4.   Revision: 2002.2.28 ver 0.0
  5. ************************************************/

  6. #include "def.h"
  7. #include "option.h"
  8. #include "2440addr.h"
  9. #include "2440lib.h"
  10. #include "2440slib.h"
  11. #include "mmu.h"

  12. // 1) Only the section table is used.
  13. // 2) The cachable/non-cachable area can be changed by MMT_DEFAULT value.
  14. //    The section size is 1MB.



  15. void MMU_Init(void)
  16. {
  17.     int i,j;
  18.     //========================== IMPORTANT NOTE =========================
  19.     //The current stack and code area can't be re-mapped in this routine.
  20.     //If you want memory map mapped freely, your own sophiscated MMU
  21.     //initialization code is needed.
  22.     //===================================================================

  23.     MMU_DisableDCache();
  24.     MMU_DisableICache();

  25.     //If write-back is used,the DCache should be cleared.
  26.     for(i=0;i<64;i++)
  27.             for(j=0;j<8;j++)
  28.                 MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));
  29.     MMU_InvalidateICache();
  30.    
  31.     #if 0
  32.     //To complete MMU_Init() fast, Icache may be turned on here.
  33.     MMU_EnableICache();
  34.     #endif
  35.    
  36.     MMU_DisableMMU();
  37.     MMU_InvalidateTLB();

  38.     //MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
  39.     MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB);  //bank0
  40.     MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB);  //bank1
  41.     MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB); //bank2
  42.     MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB); //bank3
  43.     //MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CB); //bank4
  44.     MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB); //bank4 for STRATA Flash
  45.     MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB); //bank5
  46.     MMU_SetMTT(0x30000000,0x30f00000,0x30000000,RW_CB);          //bank6-1
  47.     MMU_SetMTT(0x31000000,0x33e00000,0x31000000,RW_NCNB); //bank6-2
  48.     MMU_SetMTT(0x33f00000,0x33f00000,0x33f00000,RW_CB);   //bank6-3
  49.     MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB); //bank7
  50.    
  51.     MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB); //SFR
  52.     MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB); //SFR
  53.     MMU_SetMTT(0x5b000000,0x5b000000,0x5b000000,RW_NCNB); //SFR
  54.     MMU_SetMTT(0x5b100000,0xfff00000,0x5b100000,RW_FAULT);//not used

  55.    
  56.     MMU_SetTTBase(_MMUTT_STARTADDRESS);
  57.     MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);
  58.             //DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)
  59.     MMU_SetProcessId(0x0);
  60.     MMU_EnableAlignFault();
  61.            
  62.     MMU_EnableMMU();
  63.     MMU_EnableICache();
  64.     MMU_EnableDCache(); //DCache should be turned on after MMU is turned on.
  65. }   


  66. // attr=RW_CB,RW_CNB,RW_NCNB,RW_FAULT
  67. void ChangeRomCacheStatus(int attr)
  68. {
  69.     int i,j;
  70.     MMU_DisableDCache();
  71.     MMU_DisableICache();
  72.     //If write-back is used,the DCache should be cleared.
  73.     for(i=0;i<64;i++)
  74.             for(j=0;j<8;j++)
  75.                 MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));
  76.     MMU_InvalidateICache();
  77.     MMU_DisableMMU();
  78.     MMU_InvalidateTLB();
  79.     MMU_SetMTT(0x00000000,0x07f00000,0x00000000,attr);        //bank0
  80.     MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,attr);        //bank1
  81.     MMU_EnableMMU();
  82.     MMU_EnableICache();
  83.     MMU_EnableDCache();
  84. }   
  85.    

  86. void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
  87. {
  88.     volatile U32 *pTT;
  89.     volatile int i,nSec;
  90.     pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);
  91.     nSec=(vaddrEnd>>20)-(vaddrStart>>20);
  92.     for(i=0;i<=nSec;i++)*pTT++=attr |(((paddrStart>>20)+i)<<20);
  93. }
复制代码


但是在eboot中使用 的映射就是使用OEMAddresstable来初始化页表,这是wince真正的虚实映射
说道这里OEMAddresstable的虚拟起始地址0x80000000是wince规定的还是本来ARM决定的?
我觉得这个虚拟地址是可以改变的,所以才会可以把物理地址和虚拟地址映射成相等的?
各位有什么看法,多多交流啊。






最新回复

我现在也在学习ARM的MMU,以及中断,学习一下!  详情 回复 发表于 2010-1-6 14:26
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
个人认为,虚拟内存和物理内存是否相等完全没有关系,ADS下没有操作系统,不需要那么复杂的保护操作,映射成相等可以方便使用,开启了MMU后的cache对系统性能提高不止一点,为的就在开启了MMU的情况下还能向使用物理地址一样使用寄存器地址。
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
The kernel creates two ranges of virtual addresses from this table:

One region, from 0x80000000 to 0x9FFFFFFF, will have caching and buffering enabled.
The other region, from 0xA0000000 to 0xBFFFFFFF, will have caching and buffering disabled.

帮助文档中ARM Microprocessor这一章有说明,这个地址应该是ARM决定的,似乎是不可以随便改!
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 xajhuang 的回复:
个人认为,虚拟内存和物理内存是否相等完全没有关系,ADS下没有操作系统,不需要那么复杂的保护操作,映射成相等可以方便使用,开启了MMU后的cache对系统性能提高不止一点,为的就在开启了MMU的情况下还能向使用物理地址一样使用寄存器地址。


有道理。
——————
并且由于ADS 下没有操作系统,所以只需要使用一级页表就完全够用了,
eboot调用了大量微软的函数库,以及源代码,所以不得不和微软的映射方法相同。
不过我觉得既然可以禁用MMU,为什么还要使用它呢?据我所知,禁用MMU之后虚拟地址和物理地址是相等的。why?
——我再看看,然后再来发言,大家接着继续。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 Ricky_hu 的回复:
The kernel creates two ranges of virtual addresses from this table:

One region, from 0x80000000 to 0x9FFFFFFF, will have caching and buffering enabled.
The other region, from 0xA0000000 to 0xBFFFFFFF, will have caching and buffering disabled.

帮助文档中ARM Microprocessor这一章有说明,这个地址应该是ARM决定的,似乎是不可以随便改!


帮助文档是指在wince下,如果换了系统就会不一样,并且我发现linux下是不同的
从这个ADS代码和linux代码来看,这个虚拟地址完全是自己定义的,然后存放在内存中,通过页表传给CPU
——经过讨论,的确是认识比较深刻!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
嗯,linux下面可能会不一样,既然你看过linux下面的地址映射,那应该可以修改。可是修改这个地址会有什么意义呢?我看很多wince的书籍上介绍的都是以这个地址起始的。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
我还没看到,分还没回来都成乞丐了。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 gooogleman 的回复:
引用 1 楼 xajhuang 的回复:
个人认为,虚拟内存和物理内存是否相等完全没有关系,ADS下没有操作系统,不需要那么复杂的保护操作,映射成相等可以方便使用,开启了MMU后的cache对系统性能提高不止一点,为的就在开启了MMU的情况下还能向使用物理地址一样使用寄存器地址。


有道理。
——————
并且由于ADS 下没有操作系统,所以只需要使用一级页表就完全够用了,
eboot调用了大量微软的函数库,以及源代码,所以…


开启 MMU, 主要利用它的告诉 CACHE,这样可以大大加快系统速度,你不信比较下不开MMU时侯的系统运行的情况就明白了
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
还有就是EBoot中的MMU 映射表的问题,我觉得跟ADS也没有什么本质上的差别,只是保障了不和 WinCE 操作系统冲突,关键的是 WinCE 的MMU,WinCE需要进行任务切换和设备访问保护,所以必须对设备的访问权限进行完全的管理,最明显的就是 WinCE 下面通常会使用 CACHE 地址和 非CACHE 地址。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 5 楼 Ricky_hu 的回复:
嗯,linux下面可能会不一样,既然你看过linux下面的地址映射,那应该可以修改。可是修改这个地址会有什么意义呢?我看很多wince的书籍上介绍的都是以这个地址起始的。


wince的架构已经固定了,所以这个映射表肯定是固定的,因为微软是不开源的,我们在里面自己来一套自定义映射表,就是自找麻烦了。

——谢谢大家的积极参与
关于这个MMU和cache我已经写了两三篇博客了,不过我在文章中大量引用英文,只是加了少许注释,对这个文章很不满意,相当于写给自己看的。
下面这些书讲的比较好,大家如果想了解MMU、cache的工作原理以及硬件结构。看了他们真的会很有帮助。
ARM System Developer's Guide: Designing and Optimizing System Software
——ARM System Developer's Guide: Designing and Optimizing System Software——ARM嵌入式系统开发:软件设计与优化的英文原版——我个人感觉这是国内翻译ARM书籍最好的一本之一,比杜XX的ARM体系结构与编程好千倍。 本书虽然说软件设计与优化,但是讲的硬件也很多,比如MMU和cache等,讲的精彩纷呈:我刚才想写关于MMU和cache的博客,发现太庞大,看来这段时间要重新看看这本书才能写。
下载地址:http://download.eeworld.net/source/904273

ARM920T Technical Reference Manual——不多说了,想了解2440等的bootloader的人一定要看这个东西了,一些协处理器指令讲的很详细
下载地址:http://download.eeworld.net/source/903240

ARM Architecture Reference Manual(2nd Edition) ——比较有价值的英文ARM书籍
下载地址http://download.eeworld.net/source/901433
————————继续,看看二级页表是怎么设置的。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 6 楼 guetcw 的回复:
我还没看到,分还没回来都成乞丐了。


以后不能押那么多了,万一输了就惨了。连发帖都觉得寒酸。
 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(中级)

12
 
引用 8 楼 xajhuang 的回复:
还有就是EBoot中的MMU 映射表的问题,我觉得跟ADS也没有什么本质上的差别,只是保障了不和 WinCE 操作系统冲突,关键的是 WinCE 的MMU,WinCE需要进行任务切换和设备访问保护,所以必须对设备的访问权限进行完全的管理,最明显的就是 WinCE 下面通常会使用 CACHE 地址和 非CACHE 地址。


CPU是如何实现不同对虚拟地址的Cache和 UnCache,0x80000000~0xA000000与0xA0000000~0xC0000000的Cache和UnCache是在哪里确定的呢?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
这个我要看看代码才知道。大家一起来吧。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

14
 
呵呵!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
0x80000000 - 0x9FFFFFFF represents a CACHED address.
0xA0000000 - 0xBFFFFFFF represents and UNCACHED address.

这是wince里面的定义!bsp里面直接引用就可以了吧,没有找到定义的地方!
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 10 楼 gooogleman 的回复:
引用 6 楼 guetcw 的回复:
我还没看到,分还没回来都成乞丐了。


以后不能押那么多了,万一输了就惨了。连发帖都觉得寒酸。


gooogleman终于翻身当富农了!!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

17
 
学习下!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 10 楼 gooogleman 的回复:
引用 6 楼 guetcw 的回复:
我还没看到,分还没回来都成乞丐了。


以后不能押那么多了,万一输了就惨了。连发帖都觉得寒酸。


押宝分回来了。哈哈
——————————————————————
用户可用分最近变化日志(不含发帖用分)  
时间  分数  类别  说明  
2008-12-31 11:06:46 2772 可用分竞猜 押宝奖励可用分
2008-12-31 11:00:12 88 推荐 帖子http://topic.eeworld.net/u/20081231/10/bbde79c2-2884-48e3-9718-90d7fcc1afa8.html被推荐
2008-12-31 10:53:24 30 论坛活动 [平安圣诞周]押宝游戏,选择答案正确,额外奖励30可用分
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

19
 
学习
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 14 楼 Ricky_hu 的回复:
0x80000000 - 0x9FFFFFFF represents a CACHED address.
0xA0000000 - 0xBFFFFFFF represents and UNCACHED address.

这是wince里面的定义!bsp里面直接引用就可以了吧,没有找到定义的地方!


这个完全是由OEMAddresstable决定了,至于为什么UNCACHED 要加上0x20000000而不是别的,我还是我原来的看法。
就是这个是由于硬件原因。这个ARM貌似没有说明。知道的来知会一声。
这个再次证明了我的观点OEMAddresstable是可以自己定义的,但是微软他定了这套标准,并且所有的代码都是围绕着这个转的
有些还不开源,所以我们是不能自己乱改的。
OEMAddresstable是以cached 形式写的,在程序中我们使用unchache的时候就要自己手动加上即可,这个微软都有源代码转换的
请看C:\WINCE500\PLATFORM\COMMON\SRC\INC\oal_memory.C
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表