liurangzhou 发表于 2011-11-9 17:51:47

关于MMU的问题一直没搞懂,如果我自己的程序可以不用MMU不?用了有什么好处?哪些地方必须

RT

llf021421 发表于 2011-11-9 18:12:36

单独用MMU会降低程序的运行速度,必须把MMU和Cache一起使用

liurangzhou 发表于 2011-11-9 18:14:46

能跟我讲讲其中的原因吗?

hzr0071 发表于 2011-11-9 18:31:06

简单的原理就是mmu是利用内核外部辅助处理器读取内存(RAMorROM)中的内存映射向量表来把内存挂在到总线不的不同位置。因为映射向量表是可以软件改动的,所以可以把一个地址的内存挂载到另一个地址上。
比如你的软件的软件入口是0x40,而你有好多软件,你把他们放在0x900开始的地址上,如果没有mmu,你的软件是不可用的。如果使用mmu,把软件块挂载到0x40上,你的软件就能用了。这也是开放式操作系统能运行外部软件的原理。
因为MMU使用时需要读取向量表然后检查内存溢出状况然后才会读取内存,大大增加了指令读取周期。
配合cashe后会增加读取速度,不过仍是不用mmu的效率的1/4(没有确切依据,只是有人说arm7的效率是同频率arm9的4倍)。
关于MMU的具体调度和动态数据还要看arm9的手册。

liurangzhou 发表于 2011-11-9 18:38:23

回复【3楼】hzr0071
-----------------------------------------------------------------------

谢谢,在嵌入式系统中,我不太可能随意去增加程序,那我完全可以把入口固定吧?

也就是说MMU的优点就是能够动态的加载程序?如果我不需要动态加载,那我是不是禁止MMU会好一些?比如运行小的OS。

kebaojun305 发表于 2011-11-9 18:58:13

回复【4楼】liurangzhou
回复【3楼】hzr0071
-----------------------------------------------------------------------
谢谢,在嵌入式系统中,我不太可能随意去增加程序,那我完全可以把入口固定吧?
也就是说mmu的优点就是能够动态的加载程序?如果我不需要动态加载,那我是不是禁止mmu会好一些?比如运行小的os。
-----------------------------------------------------------------------

你可以手动设置映射表固定地址。简单来说MMU就是个查表的使用MMU时程序中的地址 不是真正的物理地址而是要建立一个表格这个表格就是程序地址和物理地址的对应   CPU在工作时先查询这个MMU的(映射表格)找出对应的物理地址(这样的好处楼上也说了 还有就是可以控制你的访问是否非法啥的)在去访问这个物理地址。

liurangzhou 发表于 2011-11-9 19:00:49

回复【5楼】kebaojun305
-----------------------------------------------------------------------

我是不是可以在编译的时候就固定,像ARM7一样,比如foo1起始在0x8000,而foo2起始在0x9000?

kebaojun305 发表于 2011-11-9 19:06:34

回复【6楼】liurangzhou
回复【5楼】kebaojun305
-----------------------------------------------------------------------
我是不是可以在编译的时候就固定,像arm7一样,比如foo1起始在0x8000,而foo2起始在0x9000?
-----------------------------------------------------------------------

可以固定   一般都会有个初始化程序可以在初始化程序中手动把MMU的映射表格设置好 不动就可以了然后你的程序就可以直接使用你固定的地址了   ,我记的有些CPUmmu不开启的话 高速缓存是不能使用的所以如果不用就手动写好MMU的映射表。

liurangzhou 发表于 2011-11-9 19:08:42

还是没搞懂MMU的作用,就是能够动态加载程序吗?

固定的话和禁用应该是没有什么太多区别咯

kebaojun305 发表于 2011-11-9 19:12:23

回复【8楼】liurangzhou
还是没搞懂mmu的作用,就是能够动态加载程序吗?
固定的话和禁用应该是没有什么太多区别咯
-----------------------------------------------------------------------
还有可以管理访问权限   你应该好好看看内核的手册
有区别的    你还是没有理解   我上面已经说了MMU简单点就是个查表的你可以理解位单片机中的查表程序(至于这个表格的存放位置 是在协处理里设置的)只不过 CPU中这个查表是硬件完成的    刚有查了下   高速缓存是要开启MMU才能用的

liurangzhou 发表于 2011-11-9 19:16:22

回复【9楼】kebaojun305
-----------------------------------------------------------------------

你说的这个作用我理解了,就是能够动态加载,至于其它的就没懂了

dr2001 发表于 2011-11-9 19:18:52

简单来说,
- 自己写的裸奔程序否用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。别的么,裸奔的话,其实无所谓了。

comway 发表于 2011-11-9 19:19:34

liuweiele 发表于 2011-11-9 19:21:48

在ARM中,MMU几个主要作用:

1. I/D Cache 管理      -> 大幅提高代码运行效率.
2. PA/VA 重映射      -> 实现多进程内存空间映射.
3. 内存权限/读写保护   -> 保护某段内存空间数据,使不能非法访问.

PSP2000 发表于 2011-11-9 19:32:24

回复【10楼】liurangzhou

-----------------------------------------------------------------------
MMU其实与计算机的发展密切相关的。
前几年我在学操作系统时,一直搞不懂MMU和虚拟内存。看了很多书,都理解的不是很深刻。
后来我看了一本书,叫做《现代操作系统》,老外写的。
我主要看里面的内存管理这一章,写的很详细,可以带你入门。
不过在读书之前,要先搞懂编译器和链接器的原理,主要涉及到代码的链接地址和运行地址这2个概念。

liurangzhou 发表于 2011-11-9 19:39:34

回复【11楼】dr2001
-----------------------------------------------------------------------

意思是开启MMU之后,数据交换效率提高,至于具体原因,我再去查资料

回复【14楼】PSP2000
-----------------------------------------------------------------------

好,我去看下,我认为我具备看这本书的条件了,MMU和虚拟内存大概了解了些,历史原因似乎是由于内存的容量没有硬盘大而产生的,可是对于ARM处理器,似乎也不需要个大于4G的ROM,故它的存在没弄懂

PSP2000 发表于 2011-11-9 19:40:34

回复【11楼】dr2001
简单来说,
- 自己写的裸奔程序否用mmu可自行决定。高兴就用,否则就关。
- 对arm,运行在外部dram上的代码而言,开启mmu后,使能dcache,能令数据io性能显著提升。
由于icache可以不依赖mmu而使能,故mmu是否开启对指令部分而言,益处不多。
- 开mmu,经过配置之后,主要程序代码和裸奔时可以一致。
最大的好处是内存访问不合规格会直接有异常,比如访问0地址,访问非法地址,etc。
- 开mmu,对于使能dma操作的情况而言,需要额外处理,否则会有内存一致性问题。
- 如果要动态加载程序,且程序不是position independent的,那么需要mmu进行地址映射。如果是pi的,则可以不用。
- 因为arm有tlb,所以转换表miss的开销不是太大,而且可以考虑转换表放内部内存,如果有地方的话。
总之,开与否mmu具体情况具体分析。应用中遇到的大部分问题,......
-----------------------------------------------------------------------
你说的很对,但是楼主可能无法消化这么多东西。

dr2001 发表于 2011-11-9 21:37:59

回复【15楼】liurangzhou
-----------------------------------------------------------------------

不要一概而论,如果一概而论的话,我也不会加那么多定语在那里。

1 Cache对高延迟外部总线上的存储器是有价值的,同时也提出程序数据访问局部性的要求。否则,开了Cache不一定获得更大的好处。
反例,如内部全速RAM,不一定值得开Cache。

2 开MMU不意味着IO性能的提升。
只是在ARMv4前后的架构下(如ARM920T/ARM926EJ-S),DCache的开启要求MMU必须开启,这是内核设定的要求;而ICache的开启和MMU开启否无关。
本来MMU和Cache就是松耦合的东西。一个管缓冲,一个管映射和权限。

3 地址映射主要是为了多进程,不同特权级,这些方面准备的,我认为。
Page Fault可以用于交换那是副产品了。


回复【16楼】PSP2000
-----------------------------------------------------------------------

知道有那么回事儿比不知道强。消化不了就酌情慢慢吃了。。。

liurangzhou 发表于 2011-11-9 21:50:13

回复【17楼】dr2001
-----------------------------------------------------------------------

非常感谢

PSP2000 发表于 2011-11-9 22:37:59

回复【15楼】liurangzhou
回复【11楼】dr2001
-----------------------------------------------------------------------
意思是开启mmu之后,数据交换效率提高,至于具体原因,我再去查资料
回复【14楼】psp2000
-----------------------------------------------------------------------
好,我去看下,我认为我具备看这本书的条件了,mmu和虚拟内存大概了解了些,历史原因似乎是由于内存的容量没有硬盘大而产生的,可是对于arm处理器,似乎也不需要个大于4g的rom,故它的存在没弄懂
-----------------------------------------------------------------------

历史原因是:
应用软件不停的膨胀,硬件(主要指内存容量)根不上软件膨胀的速度。
早期intel 8086是采用基址寄存器和界限寄存器来管理不同软件的地址映射,
后来这种方法还是无法管理大量的应用软件,于是从386开始就有了MMU。

至于你的程序用不用MMU,你若裸奔就完全不用,你若跑简单的RTOS也不必用。
除非你跑windows,linux这样的系统才有必要开MMU。

liurangzhou 发表于 2011-11-10 09:18:52

回复【19楼】PSP2000
-----------------------------------------------------------------------

懂了,非常感谢

goooogleman 发表于 2011-11-10 17:04:57

看看 ARM软件设计与优化这本书 楼主自然会豁然开朗。
页: [1]
查看完整版本: 关于MMU的问题一直没搞懂,如果我自己的程序可以不用MMU不?用了有什么好处?哪些地方必须