好久没有更新博客了,这几天再追一个MM(性格很好,兵兵很喜欢,吼吼。),今天看了一下linux中的进程调度,下面把今天看的记录下一下。
其实最需要记录的是switch_to这个函数,这个函数主要是汇编组成。里面有一个最大的卖点就是如下:
"movl $1f,%[prev_ip]\n\t" /* save EIP */ \
"pushl %[next_ip]\n\t" /* restore EIP */ \
"jmp __switch_to\n" /* regparm call */ \
"1:\t" \
"popl %%ebp\n\t" /* restore EBP */ \
"popfl\n" /* restore flags */ \
这会把1f压入到prev->eip寄存器里面,等调用完__switch_to的时候就会调用ret指令,就会找当前内核栈ip也就是next->eip。也就是在返回的时候,返回的是之前next进程被切换的时候存入的到他的eip里面的1f,这个时候,就完完全全的到了next进程之前保存的空间里来了。这样就完成了进程切换。以后在调用prev进程(也就是现在prev是第二个参数),走完__switch_to之后,就会取出现在这里存在prev->eip中的1f了。这就是这个代码的玄机,其他的。。。好像看看大概都还好理解。