mm_struct与内核线程
内核线程没有进程地址空间,也没有相关内存描述符。所以内核线程对应的进程描述符中的mm域为空。事实上,这也正是内核线程的真正含义——它们没有用户上下文。
省了进程地址空间再好不过了,因为内核线程并不需要访问任何用户空间的内存,而且内核线程在用户空间没有任何页,所以实际上它们并不需要有自己的内存描述符和页表。尽管如此,即使访问内核内存,内核线程也还是需要使用一些数据的,比如页表。为了避免内核线程为内存描述符和页表浪费内存,也为了当新内核线程运行时,避免浪费处理器周期向新地址空间进行切换,内核线程将直接使用前一个进程的内存描述符。
当一个进程被调度时,该进程的mm域指向的地址空间被加载到内存,进程描述符中的active_mm域会被更新,指向新的地址空间。内核线程没有地址空间,所以mm域为NULL。于是,当一个内核线程被调度时,内核发现它的mm域为NULL,就会保留前一个进程的地址空间,随后内核更新内核线程对应的进程描述符中的active_mm域,使其指向前一个进程的内存描述符。所以在需要时,内核线程便可以使用前一个进程的页表。因为内核线程不访问用户空间的内存,所以它们仅仅使用地址空间中和内核内核内存相关的信息,这些信息的含义和普通进程完全相同。