对linux 0.11版本中switch_to()的理解

本文详细解析了Linux 0.11内核中的switch_to()宏定义,涉及GDT、TSS、任务切换等概念。通过分析_TSS(n)宏和ljmp指令,阐述了任务切换的硬件原理和操作时机,包括JMP、CALL、中断、异常和IRET指令。最后介绍了切换后如何处理协处理器的状态。
摘要由CSDN通过智能技术生成

switch_to的代码在linux-0.11\include\linux中的sched.h。它是一个宏定义,代码如下:

#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])); \
}

首先讲一下末尾的

::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"d"(_TSS(n)),"c" ((long) task[n])); \

这句话吧,假如看过嵌入式汇编的应该知道这个内容,不过我还是多写点也帮助自己记忆。第一个冒号表示输出寄存器为空,第二个冒号表示输入寄存器,其中*&__tmp.a和*&__tmp.b存在任意寄存器中,m就代表任意寄存器,_TSS(n)即该任务在GDT中的选择符,对于这个的理解需要明白GDT的构成&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值