免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: platinum
打印 上一主题 下一主题

关于 vmalloc 的几点疑惑…… [复制链接]

论坛徽章:
0
1 [报告]
发表于 2009-05-15 12:56 |显示全部楼层
vmalloc是一页一页地去获取内存,然后把获取到的这些页映射成连续的虚拟地址;
kmalloc是一次性获取所需要的所有页,并且不需要再做映射;

vmalloc后,映射关系只体现在init_mm上,当发生缺页异常时(由于访问vmalloc的地址产生的,因为当前mm不一定就是init_mm),当前mm需要从init_mm同步vmalloc所映射的信息;(这是ULK的说法,但是好像这个是因体系结构而异的,不一定需要同步)
kmalloc所分配的空间不需要这一过程;

[ 本帖最后由 kouu 于 2009-5-15 12:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-19 21:20 |显示全部楼层
关于vmalloc后,用户进程的页表需要在缺页异常中向init_mm进行同步的问题,我一直以来也是很疑惑……
记得ulk3上面好像就是这么写的,是要在缺页异常中去同步的。

但是我觉得这样做好像有点问题,比如vmalloc将虚拟地址A映射到了物理地址a,之后由于一次缺页异常,这个映射被同步到了1号进程的页表中;再之后,vfree被调用,虚拟地址A到物理地址a的映射被撤销;再这后,vmalloc又被调用,将虚拟地址A映射到了物理地址b;再之后在使用1号进程页表的情况下(active_mm等于1号进程的mm),A是映射到a的,但是此时A却应该是映射到b的。由于此时虚拟地址A有映射,不会发生缺页异常,A到b的映射不会被更新……这样不是出问题了吗?

这个问题一直没想明白。
后来看了看pgd_alloc的实现,发现它是体系结构相关的。有些情况下,新的pgd是引用swapper_pg_dir的pmd(pud)的(大多数情况好像都是这样),这时应该不存在上面说到的同步问题;而有些情况下,新的pgd对swapper_pg_dir做了深拷贝(比如X86),pmd(pud)都是新的了,这时候就存在上面的同步问题。

更让我疑惑的是,为什么体系结构不同,会存在这样的实现差异呢?

[ 本帖最后由 kouu 于 2009-5-19 21:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP