基于Linux0.11内核分析:任务管理

任务管理

任务(Task)是处理器可以分配调度、执行、挂起的一个工作单元,它用于执行程序、任务或进程、操作系统服务、中断或异常处理过程、内核代码。
通过中断、异常、跳转、调用,可以执行一个任务,描述符表中和任务相关的:任务状态段描述符和任务门,当执行权传递给这任何一类描述符时,会造成任务切换。
任务的切换需要保存旧任务的相关信息,加载新任务的相关信息,这些信息都保存在内存中称为任务状态段的数据结构中。
任务的结构和状态
一个任务由两部分构成:

  • 任务执行空间:代码段、堆栈段、一个或多个数据段,如果使用特权级保护,那么任务执行空间需要为每个特权级提供一个独立的堆栈空间。
  • 任务状态TSS:指定了构成任务执行空间的各个段,并且保存任务状态信息
    在这里插入图片描述
    一个任务使用指向其TSS的段选择符来指定,当一个任务被加载执行时,该任务的段选择符、基地址、段限长、TSS段描述符属性就会被加载进任务寄存器TR中。如果使用了分页机制,任务使用的页,目录表基地址被加载进控制寄存器CR3中。
    当前执行任务的状态由以下内容组成:
  • 所有通用寄存器和段寄存器信息
  • 标志寄存器EFLAGS、程序指针EIP、控制寄存器CR3、任务寄存器TR和局部描述符表寄存器LDTR
  • 段寄存器指定的任务当前执行空间
  • I/O映射位图基地址和I/O位图信息
  • 特权级0、1、2的堆栈指针
  • 链接至前一个任务的链指针
    任务的执行
    软件或处理器可以使用以下方法来调度执行任务:
  • 使用CALL指令明确地调用一个任务
  • 使用JMP指令明确地跳转到一个任务
  • 隐含地调用一个中断句柄处理任务
  • 隐含地调用一个异常句柄处理任务

所有的调度任务执行的方法都会使用一个指向任务门或任务TSS段的选择符。当使用CALL或JMP指令调度时,指令中的选择符可以直接选择任务的TSS,也可以选择存放有TSS选择符的任务门,当调度任务来处理中断或异常时,那么IDT中该中断或异常表项必须是一个任务门,并且含有中断或异常处理任务的TSS选择符。

当调度一个任务时,当前正在运行任务和调度任务间会自动地发生任务切换,当前执行上下文会被保存到它的TSS中,此后新任务的上下文会被加载进处理器,并从EIP指向的指令处开始执行新任务。调用者的TSS段选择符会被保存到被调用者TSS中。

任务切换时,LDT也会进行切换,同时页目录寄存器CR3也会在切换时被重新加载,因此每个任务可以有自己的一套页表,从而允许每个任务对基于LDT的段具有不同逻辑到物理地址的映射,这些措施来实现各个任务间的隔离防止互相干扰。

任务管理数据结构

支持多任务的寄存器和数据结构:

  • 任务状态段TSS
  • TSS描述符
  • 任务寄存TR
  • 任务门描述符
  • 标志寄存器EFLAGS中的NT标志

任务状态段
用于恢复任务执行的处理器状态信息被保存在TSS段中。TSS段中各字段可分为:动态字段和静态字段
在这里插入图片描述
1、动态字段。当任务切换而被挂起,处理器会更新动态字段的内容

  • 通用寄存器字段。用于保存EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI寄存器的内容
  • 段选择符字段。用于保存ES、CS、SS、DS、FS、GS段寄存器的内容
  • 标志寄存器EFLAGS字段。在切换前保存EFLAGS
  • 指令指针EIP字段。在切换前保存EIP寄存器的内容
  • 先前任务连接字段。含有前一个任务TSS段选择符,该字段允许任务使用IRET指令切换到前一个任务
    2、静态字段。处理器会读取静态字段的内容,但通常不会改变它们
  • LDT段选择符字段。含有任务的LDT段选择符
  • CR3控制寄存器字段。含有任务使用的页目录物理地址
  • 特权级0、1、2的堆栈指针字段。这些堆栈指针由堆栈选择符(SS0、SS1、SS2)和栈中偏移量指针(ESP0、ESP1、ESP2)组成。对于指定的任务,这些字段的值是不变的。如果任务发生堆栈切换,寄存器SS和ESP的内容将会改变
  • 调试陷阱T标志字段。当设置该位时,处理器切换到该任务的操作将产生一个调试异常
  • I/O位图基地址字段。

TSS描述符
TSS描述符只能存放在GDT中。
在这里插入图片描述
任何能访问TSS描述符的程序都能够造成任务切换,可以访问TSS描述符的程序其CPL<=TSS描述符的DPL。
任务寄存器
任务寄存器TR中存放着16位的段选择符以及当前任务TSS段的整个描述符(不可见部分),处理器使用TR的不可见部分来缓冲TSS段描述符内容。
指令LTR和STR分别用于加载和保存任务寄存器的可见部分,即TSS段的选择符。LTR指令只能被特权级0的程序执行
任务门描述符
任务门描述符提供对任务的间接引用。任务门描述符可以存放在GDT、LDT、IDT表中。
任务门描述符中的TSS选择符字段指向GDT中的一个TSS段描述符,当程序通过任务门调用或跳转时,程序的CPL以及指向任务门的门选择符的RPL值<=任务门描述符的DPL
在这里插入图片描述
任务切换
在这里插入图片描述
任务切换:

  • 1、把旧任务保存在旧TSS中
  • 2、向处理器加载新任务TSS
  • 3、任务返回时,先保存当前任务相关信息新TSS
  • 4、利用新TSS中保存的旧TSS的选择符找到旧TSS
  • 5、再把旧的TSS中的信息加载到处理器中
  • 6、旧任务就继续执行

任务链
TSS的前一个任务连接字段以及EFLAGS中的NT标志用于返回到前一个任务。
在这里插入图片描述
任务切换对忙标志、NT标志、前一任务链字段和TS标志的影响:
在这里插入图片描述
任务地址空间
任务地址空间由任务能够访问的段构成:代码段、数据段、堆栈段、TSS中引用的系统段以及任务代码能够访问的任何其它段,这些段都被映射到处理器的线性地址中,并且随后被直接或通过分页机制映射到处理器的物理地址空间中。
把人物为映射到线性和物理地址空间:

  • 所有任务共享一个线性到物理地址空间的映射(未开启分页)
  • 每个任务有自己的线性地址空间,并映射到物理地址空间(开启分页)
    不同任务的线性地址空间可以映射到完全不同的物理地址空间。对于映射任务线性地址空间的这两种方法,所有任务的TSS都必须存放在共享的物理地址空间中,所有任务都可以进行访问。GDT所映射的线性地址空间也应该映射到共享的物理地址空间。
    当多个任务间要进行数据共享时,可以做一些共享数据段,描述符存放在GDT表中,那么所有的任务就可以进行访问。

猜你喜欢

转载自blog.csdn.net/qq_42856154/article/details/89765360