Chinaunix
标题:
切换为内核线程需要重新加载CR3吗
[打印本页]
作者:
今天不吃面
时间:
2016-10-27 12:27
标题:
切换为内核线程需要重新加载CR3吗
看到这么一篇文章
blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4808877&uid=14528823
其中有这么一段
当内核中进行进程上下文切换时,有如下两种情况,实际上是不需要立刻进行TLB刷新的,可以避免应TLB刷新代理店额性能损失,Linux充分考虑了这些情况,可谓将
相关性能进行了充分发挥:
1)当从普通进程切换到内核线程时。由于Linux中,所有进程共享内核地址空间,内核线程并不使用用户态部分的地址空间,只使用内核部分,所以,当从普通进程切换到内核线程时,内核线程继续沿用prev进程的用户态地址空间,但是并不访问,其只访问内核部分。因此,这种情况下,实际不不需要立刻flush TLB。
对于上述的第1中情况,如果不进行特殊处理,
实际是会在重新加载CR3时触发TLB刷新的
,从而导致性能损失。TLB lazy刷新模式即针对这种情况设计
然而我在源码里看到
if (unlikely(!mm)) {
next->active_mm = oldmm;
atomic_inc(&oldmm->mm_count);
enter_lazy_tlb(oldmm, next);
} else
switch_mm(oldmm, mm, next);
而cr3的加载是在switch_mm里进行的
作者:
nswcfd
时间:
2016-10-28 14:34
ULK里确实是这么说得到,会不会进入了上面那个分支(也就是说,没有switch_mm)?
作者:
captivated
时间:
2016-11-13 01:22
是这样, 原因LZ已经提及. 因为内核线程不与任意用户层进程相关, 因此用户进程的 mm 没有用处. 如果创建内核线程的话, 内核使用 active_mm 保存 mm, 并且将 mm 置为 NULL, 所以创建内核线程时, 按照 LZ 贴的代码是走 unlikely 分支.
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2