关于MMU的作用的讨论.txt
简单来说,
- 自己写的裸奔程序否用MMU可自行决定。高兴就用,否则就关。
- 对ARM,运行在外部DRAM上的代码而言,开启MMU后,使能DCache,能令数据IO性能显著提升。
由于ICache可以不依赖MMU而使能,故MMU是否开启对指令部分而言,益处不多。
- 开MMU,经过配置之后,主要程序代码和裸奔时可以一致。
最大的好处是内存访问不合规格会直接有异常,比如访问0地址,访问非法地址,etc。
- 开MMU,对于使能DMA操作的情况而言,需要额外处理,否则会有内存一致性问题。
- 如果要动态加载程序,且程序不是Position Independent的,那么需要MMU进行地址映射。如果是PI的,则可以不用。
- 因为ARM有TLB,所以转换表Miss的开销不是太大,而且可以考虑转换表放内部内存,如果有地方的话。
总之,开与否MMU具体情况具体分析。应用中遇到的大部分问题,无论有否MMU,都有解决方案。
如果代码和数据都在外部DRAM上,那么建议开启MMU,主要是为了DCache。别的么,裸奔的话,其实无所谓了。
在ARM中,MMU几个主要作用:
1. I/D Cache 管理 -> 大幅提高代码运行效率.
2. PA/VA 重映射 -> 实现多进程内存空间映射.
3. 内存权限/读写保护 -> 保护某段内存空间数据,使不能非法访问.
MMU其实与计算机的发展密切相关的。
前几年我在学操作系统时,一直搞不懂MMU和虚拟内存。看了很多书,都理解的不是很深刻。
后来我看了一本书,叫做《现代操作系统》,老外写的。
我主要看里面的内存管理这一章,写的很详细,可以带你入门。
不过在读书之前,要先搞懂编译器和链接器的原理,主要涉及到代码的链接地址和运行地址这2个概念。
不要一概而论,如果一概而论的话,我也不会加那么多定语在那里。
1 Cache对高延迟外部总线上的存储器是有价值的,同时也提出程序数据访问局部性的要求。否则,开了Cache不一定获
得更大的好处。
反例,如内部全速RAM,不一定值得开Cache。
2 开MMU不意味着IO性能的提升。
只是在ARMv4前后的架构下(如ARM920T/ARM926EJ-S),DCache的开启要求MMU必须开启,这是内核设定的要求;而
ICache的开启和MMU开启否无关。
本来MMU和Cache就是松耦合的东西。一个管缓冲,一个管映射和权限。
3 地址映射主要是为了多进程,不同特权级,这些方面准备的,我认为。
Page Fault可以用于交换那是副产品了。
推荐书籍<<ARM软件设计与优化>>
第 1 页