Lab5:深入理解进程切换
首先找到对应进程调度的代码文件
Kernal/sched/core.c
找到 context_switch() 函数
其中包括rq,为进程的running queue;以及进程切换前后的进程描述符prev和next
首先调用一些函数做上下文切换的准备,与最后出现的finish_task_switch()成对使用
接着进行进程地址空间的切换
(1) 对于next->mm为空的情况,这是一个内核级线程(to kernal),此时linux使用active_mm指向其实际地址空间。此时首先调用entry_lazy_tlb进入lazy_tlb模式
接着将prev进程的active_mm赋给next进程,并在prev进程是用户进程的情况下调用mmgrab,增加prev的active_mm空间的引用计数,因为它现在同时被next进程所持有。
在prev是内核进程的情况下,将其active_mm指针置空即可
(2) 对于其他情况 ,即next为一个用户线程,调用membarrier_switch_mm创建内存屏障,保证进程访问mm的先后顺序
接着调用switch_mm_irqs_off进行地址空间切换,这是一个很长的函数
标签:操作系统,mm,next,switch,切换,linux,进程,prev From: https://www.cnblogs.com/lijiang2023/p/17353591.html