文章标题

来源:互联网 发布:plc编程技巧 编辑:程序博客网 时间:2024/06/05 19:49

一个任务由两部分组成

  • 任务执行空间,由代码段,栈段,和一个或多个数据段组成
  • 任务状态段(TSS)

如果操作系统使用处理器特权级机制,那么任务执行空间会对每个特权级提供不同的栈(实际上是对0, 1, 2三个特权级分别提供不同的栈)

一个正在被执行的任务状态包括

  • 任务当前执行的空间,由各种段选择子决定(CS, DS, SS, ES, FS和GS)。在线性地址空间中,是一个段空间
  • 通用寄存器状态,包括EAX, ECX, EDX, EBX, ESP, ESI和EDI的值
  • EIP寄存器的状态,即EIP的值
  • CR3控制寄存器的值
  • 任务寄存器(TR)的状态
  • LDTR寄存器的状态
  • I/O内存映射的基地址(包含在TSS中),(共享内存?)
  • 三个栈指针,分别指向特权级0, 1, 2的栈地址
  • 上一个被执行的任务的link(地址)

任务状态中最后一个”上一个被执行的任务的link”指的是以下情况

  • 当某个任务执行过程中使用CALL指令调用一个新任务时,在新任务的任务状态中会包含先前的那个任务的地址,以便于当新任务执行完成后可以返回到先前的任务接着执行。很像汇编中CALL指令调用函数时将下一条语句的地址入栈。

软件或者处理器可以使用以下几种方法调度一个任务

  • 显式使用CALL指令调用某个任务
  • 显式使用JUMP指令跳转到某个任务
  • 由处理器隐式调用中断处理任务
  • 隐式调用异常处理任务(也是由处理器?)
  • 如果EFLAGS的NT标志被设置,那么可以使用IRET指令在返回时隐式调转到某个任务

上述的所有方法都是通过一个指向任务段描述符的段选择子或者任务门描述符实现的。
也就是说指令的操作数可能直接是一个段选择子,这个选择子指向GDT中的任务段描述符。也可以是一个任务门描述符,这个任务门包含任务段选择子,同样可以选择GDT中的任务段描述符。

原创粉丝点击