Linux进程(之)进程切换函数switch_to()解析

本文详细介绍了Linux系统中进程切换的关键函数switch_to()的工作原理。通过C内嵌汇编实现,该函数负责保存和恢复进程的栈指针ESP和指令指针EIP,确保进程切换的正确性。在A→B→C→A的切换流程中,文章分析了每个步骤如何处理进程上下文,尤其是如何确保在C返回到A时,prev指针正确地指向C,以便后续的清理工作。尽管esi和edi变量的作用尚不明确,但整个切换流程清晰呈现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程切换过程是由一段汇编代码switch_to完成,主要功能是保存当前进程的esp和eip,恢复切换到的进程的esp和eip。
关于C内嵌汇编的使用,可以参见: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

其调用过程如下:
switch_to(prev, next, prev);
barrier();
finish_task_switch(this_rq(), prev);

从上面代码可以看出,保证进程被切换回来后,prev是一个正确值也是switch_to需要考虑的问题。
如: A=>B, B=>C, C=>A
若不进行处理时,在进程A被切换出去,再切换回来后,prev指向的是A。
而期望的值为C,这样才能对C做进一步的清理工作。

swith_to代码如下:
#define switch_to(prev,next,last) do {					\
	unsigned long esi,edi;						\
	asm volatile("pushfl\n\t"		/* Save flags */	\
		     "pushl %%ebp\n\t"					\
		     "movl %%esp,%0\n\t"	/* save ESP */		\
		     "movl %5,%%esp\n\t"	/* restore ESP */	\
		     "movl $1f,%1\n\t"		/* save EIP */		\
		     "pushl %6\n\t"		/* restore EIP */	\
		     "jmp __switch_to\n"				\
		     "1:\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值