switch_to(n)函数

本文深入解析Linux内核0.11版本的switch_to()函数,探讨其在任务切换中的作用。首先检查目标任务是否与当前任务相同,如果相同则不进行切换。接着,保存原任务状态,并将新任务的TSS信息加载到硬件寄存器中,进行一系列的描述符和寄存器更新,以完成任务切换。涉及的内容包括任务状态段、协处理器、寄存器保存与恢复等核心概念。
摘要由CSDN通过智能技术生成


这篇文章我们来分析switch_to()函数, 分析的代码取自linux kernel 0.11 sched.h文件, 我们只为说明原理, 所以尽量简单. 其中代码注释参考了赵炯老师<Linux内核完全注释>一书, 言归正传,下面来看switch_to()函数.

switch_to(n)将切换当前任务到任务n.首先检测任务n是不是当前任务,是则直接退出.

输入: %0 – 指向_tmp                                        1% - 指向_tmp.b处, 用于存放新TSS的选择符

          dx – 新任务n的TSS段选择符 ecx – 新任务n的任务结构指针task[n].

_tmp用于jump指令的操作数, 其中a值是32位偏移地址, 而b的低2字节是新TSS段的选择符. 细心的读者看到a并没有被赋值,可以思考一下这是为什么

#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
	"je 1f\n\t" \
	"movw %%dx,%1\n\t" \
	"xchgl %%ecx,_current\n\t" \
	"ljmp %0\n\t" \
	"cmpl %%ecx,_last_task_used_math\n\t" \
	"jne 1f\n\t" \
	"clts\n" \
	"1:" \
	::"m" (*&__tmp.a),"m" (*&__tmp.b), \
	"d" (_TSS(n)),"c" ((long) task[n])); \
}
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值