关于vmalloc

mayuhao 2007-08-06 02:56:57
内核空间中,从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对应的物理页面吗?

恕我愚钝,不知是否表达清楚了我的意思.请大家解惑,谢谢!
...全文
1470 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tb01412 2007-08-07
  • 打赏
  • 举报
回复
系统初始化的时候,第二次正式初始化页表,应该是对线性地址范围从_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对应的物理页面吗?
============================================================================
伙伴算法用于物理页面请求,适用于所有需要动态申请内存的地方!!!它属于地址分配的最底层代码



4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧