1、此四个变量均在task_struct结构体中。
2、mm_user和mm_count的初始值均为1,其中mm_user用来统计一个进程中(一个线程组)中有多少个线程,每增加一个线程则mm_user加1,减少一个线程则mm_usr减1.mm_count用在用户进程切换到内核进程的过程中,内核进程会借用用户进程的地址空间描述符mm。内核进程借用用户进程的mm的目的为优化调度切换。借用即引用,需要将用户进程的mm_count加1,防止用户进程的mm在被内核进程引用的过程中却被销毁,内核在销毁进程mm的时候需要检查mm_count是否为0。
3、对于用户进程 mm 和 active_mm都是相同的,且不为nullptr。 对于内核进程,mm为NULL,运行时active_mm为同一CPU上最近运行的用户进程的mm,内核被切换出去前active_mm会被设置为NULL. mm可用于却分内核进程和用户进程。而active_mm则被用于优化加速执行switch_mm()。如下图所示,若需要切换的两个进程的mm相同则无需执行switch_mm()中的_switch_mm(),起到加速作用,
上图为内核V6.3.8版本,在Arm64中,switch_mm_irqs_off == switch_mm 。
上图箭头所示,在此处实现使用active_mm优化usr transfer. 这种优化情况发生在A(usr thread)->B(kernel thread)->A(usr thread)这种情况,当然A和A之间可以有多个B,不过B一定要是内核线程,不然就不满足箭头所指的条件,无法进行优化加速。接下来我们来看看__switch_mm到底实现了哪些功能。