LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1828|回复: 3

task_struct中的active_mm指针有什么作用?

[复制链接]
发表于 2004-12-24 23:47:04 | 显示全部楼层 |阅读模式
Understanding The Linux Virtual Memory Manager上说使用active_mm可以避免TLB flush。可是我没看明白。
在源代码中找了一下,应该是在context_switch()这个函数中实现的吧,可是下面这段代码我没看明白
        if (unlikely(!mm)) {
                next->active_mm = oldmm;
                atomic_inc(&oldmm->mm_count);
                enter_lazy_tlb(oldmm, next, smp_processor_id());
        } else
                switch_mm(oldmm, mm, next, smp_processor_id());

        if (unlikely(!prev->mm)) {
                prev->active_mm = NULL;
                BUG_ON(rq->prev_mm);
                rq->prev_mm = oldmm;
        }
为什么这段代码可以实现lazy TLB呢?
发表于 2004-12-25 14:03:23 | 显示全部楼层
lazy TLB应该是指在切换进程过程中如果下一个执行进程不会访问用户空间,就没有必要flush TLB;
kernel thread运行在内核空间,它的mm_struct指针mm是0,它不会访问用户空间。 if (unlikely(!mm))是判断切换到的新进程是否是kernel thread,如果是,那么由于内核要求所有进程都需要一个mm_struct结构,所以需要把被切换出去的进程(oldmm)的mm_struct借过来存储在active_mm( next->active_mm = oldmm;),这样就产生了一个anomymous user, atomic_inc(&oldmm->mm_count)就用于增加被切换进程的mm_count,然后就利用 enter_lazy_tlb标志进入lazeTLB模式(MP),对于UP来说就这个函数不需要任何动作; if (unlikely(!prev->mm))这句话是判断被切换出去的进程是不是kernel thread,如果是的话就要释放它前面借来的mm_struct。而且如果切换到的进程与被切换的kernel thread的page table相同,那么就要flush与这些page table 相关的entry了。
注意这里的连个if都是针对mm_struct结构的mm指针进行判断,而设置要切换到的mm_struct用的是active_mm;
对于MP来说,假如某个CPU#1发出需要flushTLB的要求,对于其它的CPU来说如果该CPU执行kernel thread,那么由CPU设置其进入lazyTLB模式,不需要flush TLB,当从lazyTLB模式退出的时候,如果切换到的下个进程需要不同的PageTable,那此时再flush TLB;如果该CPU运行的是普通的进程和#1相同,它就要立即flush TLB了。
说的条理可能不是很清楚,我也是才看内核不久,说的不对希望可以和大家一起讨论讨论:)
 楼主| 发表于 2004-12-25 17:12:47 | 显示全部楼层
我是有点看晕了
应该是我没有内核其他部分的知识吧。
算了,先不理这个了
谢谢楼上了
发表于 2004-12-25 19:37:59 | 显示全部楼层
你看一下进程相关的概念,对这些至少有个粗略的理解应该不成问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表