Chinaunix

标题: 关于MMU的一个疑问 [打印本页]

作者: any_wind    时间: 2011-12-05 17:13
标题: 关于MMU的一个疑问
好像在bootloader和kernel中都能直接访问物理地址

记得再bootloader中说的是,因为全部使用物理地址操作,不需要开启MMU,我以前以为在kernel中
所有的物理地址ioremap然后在访问,但发现有简单的___raw_readl(),能直接对物理地址进行操作,读写。


我想问问大家,

MMU应该是一个硬件设备吧,负责物理地址和虚拟地址的转换,那么开启MMU,kernel中为什么也可以直接访问物理地址呢?
请教下MMU这个硬件到底是什么作用,开启和关闭有什么区别?
作者: any_wind    时间: 2011-12-06 09:43
顶顶
作者: 相逢的日子    时间: 2011-12-06 11:10
MMU字面意思就是Memory management unit,负责逻辑地址和实际内存或者虚拟内存的映射关系。比如在32位的系统里,最大的寻址空间是4GB,假设这时候有一个程序需要800M的内存,但这时候物理内存只有512,这就需要虚拟内存,MMU就负责这种映射。
还有就是实现数据的保护,比如程序1和程序2,他们指向的地址0x1234在MMU运行的时候未必是同一个物理地址,是被映射过的
作者: any_wind    时间: 2011-12-06 15:54
回复 3# 相逢的日子


    这位哥,你说的我知道额,但是不是我要的
作者: any_wind    时间: 2012-02-13 14:20
自己顶顶

谁能介绍下
作者: vimedu    时间: 2012-02-14 11:23
开启MMU后,不能访问物理地址吧?
作者: MagicBoy2010    时间: 2012-02-14 13:12
MMU应该是一个硬件设备吧,负责物理地址和虚拟地址的转换,那么开启MMU,kernel中为什么也可以直接访问物理地址呢?
请教下MMU这个硬件到底是什么作用,开启和关闭有什么区别?

===============================
MMU是SoC内部的一个硬件逻辑部件,如果开启MMU,所有的内核逻辑地址必须经过MMU的转换才能成为物理地址。关闭了的话,逻辑地址就是物理地址,不需要转换了。
作者: 251316192    时间: 2012-02-29 15:36
本帖最后由 251316192 于 2012-02-29 15:54 编辑

#define __raw_readl(a)                (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))
已经映射在高端内存了。在统一编址的体系,很多io口地址已经在内存管理初始化映射在了高端内存区,一般就和虚拟地址差个offset,___raw_readl()添加了地址空间检测,catche或者write buffer等的操作,因为对应的是io口,不能有边际效益。ioremap就是建立虚拟地址和物理地址的空间,因为已经映射好了。就没必要再映射了。都用虚拟地址。开了mmu不可能用物理地址。
作者: smalloc    时间: 2012-03-04 15:09
有些ARCH有些区域不收MMU影响
作者: any_wind    时间: 2012-03-12 15:33
thanks for all




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2