请教ARM中关于MMU的几个问题
本人基于s3c2410开发板学习MMU部分,遇到几个问题想不明白:
1、板载SDRAM是64M,物理地址是0x30000000 - 0x33f00000,在初始化MMU页表时,把SDRAM的虚拟地址也映射到这个范围,是为什么?是不是为了跟没有MMU下的地址操作变得一样,也就是方便移植?
2、每个进程都有自己的运行空间,意思是不是指有各自的页表?即MVA?
3、我试着在x86上反复运行同一个程序读同一个地址的值,发现读出来的值会不同,是不是因为每次运行,都建立了不同的内存映射关系,导致读取的物理地址有可能不同?
在这里还没混多久,没分,没办法,还望不吝赐教。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
1 应该和X86相似吧,内核使用虚拟地址时,由于在使用分页前后引用一个地址都要是在物理内存中的同一个地址,因为连接的时候都是相对一个PAGE_OFFSET,而你的PAGE_OFFSET和PHYS_OFFSET都是0x3000000;所以物理地址和虚拟地址就是同样的了
在x86上,PAGE_OFFSET是0xC0000000,所以在没有分页的使用引用变量需要使用变量的值-0XC0000000,而你的系统上则不需要
就是个映射,能简单就简单
2. 如果只能用半句话说,我觉得就应该是你说的这样了,页表不一样,所以进程之间就不会相互影响了,如果是内存共享,那么页表也是不一样的,但是都是映射到同一物理地址
3. 读出来的都是虚拟地址,看不到物理地址,你读的是栈上的地址吧,全局的就是绝对虚拟地址了
感谢楼上兄弟的回答,我读的的确是栈上的地址。我还有疑问:初始化的MMU页表和进程的虚拟地址MVA是什么关系啊?是一个表吗?我感觉我真的糊涂了。。。ARM里根据不同进程的PID,会重建MVA,会不会把原来初始化的对应好的那部分页表内容给覆盖掉啊?请帮帮我吧,这方面有什么资料可查么
你说的初始化的页表是内核自己使用的,进程的页表会在执行进程时(execve)建立,根据可执行文件的内容,分配相应的物理内存(不说延迟分配),然后把进程的页表更改相应的项,这样进程就有自己的页表了
请问MVA是什么的简称?
ULK吧,你可以浏览一下第2,8,9章,特别是第二章,虽然各体系结构有差别,细节上可能相差很大,但是总的来说是相似的,书上说的是X87的
原来是内核和进程两套页表,感谢。。。
MVA是ARM中的,叫“转换后的虚拟地址”,是根据进程的PID将虚拟地址VA转换成MVA的,我理解是为了减少进程切换时更新页表的开支的:
if(VA < 32M)
MVA = VA | (PID<<25); //VA<32M,即PID*0x02000000作为该进程起始地址
else
MVA = VA; //VA>=32M
我的基础不好,以后多向你学习!