当前位置: 技术问答>linux和unix
关于vmalloc
来源: 互联网 发布时间:2016-02-04
本文导语: 内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等) kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地...
内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等)
kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址
vmalloc申请的内存则位于vmalloc_start~vmalloc_end之间,与物理地址没有简单的转换关系,虽然在逻辑上它们也是连续的,但是在物理上它们不要求连续。
我的问题是:
1系统初始化的时候,第二次正式初始化页表,应该是对线性地址范围从_end到zone_normal结束(即896m)之间的页面提供了映射.这部分的物理地址和线性地址有简单的转换关系,如上所提到的.
2而在vmalloc()辗转调用vmalloc_area_pages()时,分配所需页面时,这里所用到的page,对应的映射关系是不是没有在前面的系统初始化中完成,而单独在这里实现的?即这里的动作对上面1里的系统页表毫无影响,而仅仅是在1的基础之上另外映射了一个vm_area对应的区域?
3伙伴算法可以分配的页面包括哪些?包括vmalloc_start~vmalloc_end对应的物理页面吗?
恕我愚钝,不知是否表达清楚了我的意思.请大家解惑,谢谢!
kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址
vmalloc申请的内存则位于vmalloc_start~vmalloc_end之间,与物理地址没有简单的转换关系,虽然在逻辑上它们也是连续的,但是在物理上它们不要求连续。
我的问题是:
1系统初始化的时候,第二次正式初始化页表,应该是对线性地址范围从_end到zone_normal结束(即896m)之间的页面提供了映射.这部分的物理地址和线性地址有简单的转换关系,如上所提到的.
2而在vmalloc()辗转调用vmalloc_area_pages()时,分配所需页面时,这里所用到的page,对应的映射关系是不是没有在前面的系统初始化中完成,而单独在这里实现的?即这里的动作对上面1里的系统页表毫无影响,而仅仅是在1的基础之上另外映射了一个vm_area对应的区域?
3伙伴算法可以分配的页面包括哪些?包括vmalloc_start~vmalloc_end对应的物理页面吗?
恕我愚钝,不知是否表达清楚了我的意思.请大家解惑,谢谢!
|
系统初始化的时候,第二次正式初始化页表,应该是对线性地址范围从_end到zone_normal结束(即896m)之间的页面提供了映射.这部分的物理地址和线性地址有简单的转换关系,如上所提到的.
================================================================================
说得有一些错误的地方,并没有完全映射所有地址空间!!!,只有使用过的物理内存才有映射(或者暂时没用,但保留着使用,比如缓存池等)
2而在vmalloc()辗转调用vmalloc_area_pages()时,分配所需页面时,这里所用到的page,对应的映射关系是不是没有在前面的系统初始化中完成,而单独在这里实现的?即这里的动作对上面1里的系统页表毫无影响,而仅仅是在1的基础之上另外映射了一个vm_area对应的区域?
============================================================================
调用vmalloc()与kmalloc函数有一定的区别,kmalloc建立的页表映射关系中,虚拟地址是大于3的,而vmalloc返回的是小于3G的虚拟地址,还有一点不同的是,vmalloc()可以分段映射,比如你需要4M的连续虚拟地址空间,它可以用1024个不连续的物理页映射4M连续的虚拟地址空间出来.小于3G的虚拟地址管理就存在于vm_area数据结构中,你的问题在看清楚第一个问题的答案之后,就迎刃而解了,回为你第一个问题理解错了,所以才有第二个问题的疑问
3伙伴算法可以分配的页面包括哪些?包括vmalloc_start~vmalloc_end对应的物理页面吗?
============================================================================
伙伴算法用于物理页面请求,适用于所有需要动态申请内存的地方!!!它属于地址分配的最底层代码
================================================================================
说得有一些错误的地方,并没有完全映射所有地址空间!!!,只有使用过的物理内存才有映射(或者暂时没用,但保留着使用,比如缓存池等)
2而在vmalloc()辗转调用vmalloc_area_pages()时,分配所需页面时,这里所用到的page,对应的映射关系是不是没有在前面的系统初始化中完成,而单独在这里实现的?即这里的动作对上面1里的系统页表毫无影响,而仅仅是在1的基础之上另外映射了一个vm_area对应的区域?
============================================================================
调用vmalloc()与kmalloc函数有一定的区别,kmalloc建立的页表映射关系中,虚拟地址是大于3的,而vmalloc返回的是小于3G的虚拟地址,还有一点不同的是,vmalloc()可以分段映射,比如你需要4M的连续虚拟地址空间,它可以用1024个不连续的物理页映射4M连续的虚拟地址空间出来.小于3G的虚拟地址管理就存在于vm_area数据结构中,你的问题在看清楚第一个问题的答案之后,就迎刃而解了,回为你第一个问题理解错了,所以才有第二个问题的疑问
3伙伴算法可以分配的页面包括哪些?包括vmalloc_start~vmalloc_end对应的物理页面吗?
============================================================================
伙伴算法用于物理页面请求,适用于所有需要动态申请内存的地方!!!它属于地址分配的最底层代码
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。