当前位置:  技术问答>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对应的物理页面吗?

恕我愚钝,不知是否表达清楚了我的意思.请大家解惑,谢谢!

|
系统初始化的时候,第二次正式初始化页表,应该是对线性地址范围从_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对应的物理页面吗?
============================================================================
伙伴算法用于物理页面请求,适用于所有需要动态申请内存的地方!!!它属于地址分配的最底层代码




    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • vmalloc用法???


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3