当前位置: 技术问答>linux和unix
linux中线性内存地址映射成离散物理的地址
来源: 互联网 发布时间:2017-05-02
本文导语: 最近在学习linux内核,书上说线性内存地址转换成物理内存地址可以减少碎片,但是线性内存地址是怎么映射成离散的物理内存地址呢,百思不得其解,网上查了很多资料,要么看不懂,要么牛头不对马嘴,很是郁闷...
最近在学习linux内核,书上说线性内存地址转换成物理内存地址可以减少碎片,但是线性内存地址是怎么映射成离散的物理内存地址呢,百思不得其解,网上查了很多资料,要么看不懂,要么牛头不对马嘴,很是郁闷,有人帮帮我解决这个问题么,另外,有前辈指点一下学习内核的方法么,我是freshman,不想走太多弯路,这样很浪费时间,谢谢各位,不胜感激。
|
MMU硬件完成转换和映射,但需要操作系统提供映射页表。
你可以针对自己研究的处理器,着重研究一下mmu和进程空间映射这一块。
内核学习没有多少捷径可走,找自己感兴趣的方面,塌下心来看书,看代码。
你可以针对自己研究的处理器,着重研究一下mmu和进程空间映射这一块。
内核学习没有多少捷径可走,找自己感兴趣的方面,塌下心来看书,看代码。
|
举个例子吧比如有两块内存,是碎片,分别是4K,
物理地址是 0x04000开始和0x14000开始
通过内存映射,虚拟地址为 0x800000开始,可以使用连续的8K空间来映射这2块4K的内存
学习内核好像真的没什么捷径,就像是练内功一样。
物理地址是 0x04000开始和0x14000开始
通过内存映射,虚拟地址为 0x800000开始,可以使用连续的8K空间来映射这2块4K的内存
学习内核好像真的没什么捷径,就像是练内功一样。
|
可以看看基础点的汇编知识!
|
这个可以分两部分,一个是用户态线性地址空间到物理页框的映射,一个是内核对页框资源的管理。前者是通过页表来做的,内核负责维护页表,硬件mmu负责用户进程代码执行时的虚拟地址到物理地址的转换,页表这个东西我觉得你应该有个基础的了解吧,虚拟地址映射物理地址是在进程需要对虚拟地址首次进行写操作时做的(实际上还有其他情况,比如页高速缓存,swap后恢复等),这时由于虚拟地址未能映射物理地址,mmu转换时会产生缺页异常,内核利用异常处理程序来为这个虚拟地址映射一个物理页框。这个页框内核是如何去获得的,也就是第二个问题了,内核有一个叫伙伴系统的东西来管理空闲页框,这个有兴趣可以去看看,也很简单