免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1254 | 回复: 1

[内核入门] vmalloc区域释放的页表如何处理? [复制链接]

论坛徽章:
0
发表于 2016-03-18 21:40 |显示全部楼层
内核版本:linux 2.6.30

struct vm_struct *remove_vm_area(const void *addr)
{
        struct vmap_area *va;

        va = find_vmap_area((unsigned long)addr);
        if (va && va->flags & VM_VM_AREA) {
                struct vm_struct *vm = va->private;
                struct vm_struct *tmp, **p;

                vmap_debug_free_range(va->va_start, va->va_end);
                free_unmap_vmap_area(va);
                vm->size -= PAGE_SIZE;

                write_lock(&vmlist_lock);
                for (p = &vmlist; (tmp = *p) != vm; p = &tmp->next)
                        ;
                *p = tmp->next;
                write_unlock(&vmlist_lock);

                return vm;
        }
        return NULL;
}
static void free_unmap_vmap_area(struct vmap_area *va)
{
        flush_cache_vunmap(va->va_start, va->va_end);
        free_unmap_vmap_area_noflush(va);
}
static void free_unmap_vmap_area_noflush(struct vmap_area *va)
{
        va->flags |= VM_LAZY_FREE;
        atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr);
        if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages()))
                try_purge_vmap_area_lazy();
}
可以看到,它还先把当前要释放的pte表项的数目添加到全局变量vmap_lazy_nr,然后在判断是不是超过lazy_max_pages()来确定是不是释放掉页表项。
那如果没有超过,而且是unlikely的。。那如果再次访问该区域是不是还会继续操作原本映射的内存呢?
在后面虽然是有把vmalloc映射的内存也释放掉,但是应该和MMU的映射没有什么关系吧。
反正它能够最终把虚拟地址映射到一个物理内存上。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-03-21 16:19 |显示全部楼层
貌似低版本(例如2.6.1x)的行为不是这样,没有VM_LAZY_FREE的行为。

-------------------------

为啥3.8版本的free_unmap_vmap_area_noflush先调用unmap_vmap_area?
http://lxr.free-electrons.com/source/mm/vmalloc.c?v=3.8#L669

释放(init_mm)的页表是在unmap_vmap_area里完成的吧?

lazy的部分只负责清空rb_tree和释放vmap_area?
http://lxr.free-electrons.com/source/mm/vmalloc.c?v=3.8#L455
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP