Linux 简单多任务

转自:http://blog.sina.com.cn/s/blog_626aed8b0100idnx.html

Linux 简单多任务_第1张图片Linux 简单多任务_第2张图片Linux 简单多任务_第3张图片Linux 简单多任务_第4张图片Linux 简单多任务_第5张图片Linux 简单多任务_第6张图片Linux 简单多任务_第7张图片Linux 简单多任务_第8张图片Linux 简单多任务_第9张图片Linux 简单多任务_第10张图片Linux 简单多任务_第11张图片Linux 简单多任务_第12张图片Linux 简单多任务_第13张图片Linux 简单多任务_第14张图片

注:. 用JMP或CALL指令直接访问新任务的任务状态段
   例如: JMP(或CALL) 偏移量 选择符   (在linux 中 ljmp $SS1SEL,$0)
  不用指令中的选择符即为新任务的任务状态段的选择符,把此选择符加载TR就形成任务切换(当然要经过合法性保护检查)。其切换过程可以概括为下列步骤:
  (1) 将离去任务的状态存放在离去任务的TSS中。任务状态包括离去任务所使用的所有寄存器:8个32位通用寄存器,6个段寄存器和EFLAGS等。此时应该将EIP指向 跳转语句的下一条语句,并将其保存至TSS结构中。
  (2) GDTR中的基地址加上指令中选择器的索引×8来选择新任务的TSS描述符。
  (3) 新任务的TSS描述符指向了新任务的TSS。对于任务嵌套任务,TR的选择器部分被存入新的TSS的“后备连接TSS选择器”字中。
  (4)TR寄存器 由指令中的选择器和新任务的TSS描述符装载。
  (5)新TSS中的LDT选择器的索引×8加上GDTR中的基地址来选择新任务的LDT描述符。
  (6)根据新任务的LDT描述符和新TSS中的LDT选择器来装载LDTR寄存器。
  (7)EIP和CS选择器分别存入EIP和CS寄存器。
  (8)新TSS中的CS选择器的索引×8和GDTR的基地址或刚刚装载了新内容的LDTR中的基地址相加被用来从GDT或新的LDT中选择一个代码段描述符。
  (9)这个代码段描述符被存入CS缓冲器。
  (10)CS缓冲器的基地址与EIP相加产生程序的入口地址,然后启用新TSS的内容来填充新任务的各寄存器。
  (11)执行新的任务。

Linux 简单多任务_第15张图片Linux 简单多任务_第16张图片Linux 简单多任务_第17张图片

你可能感兴趣的:(linux,任务)