Intel® 64 and IA-32 Architectures Software Developer Manuals中文翻译 任务管理

第七章 任务管理

本章描述了IA-32架构的任务管理设置。这些设置只有当处理器在保护模式下运行才有效。

本章重点介绍32位任务和32位TSS结构。关于16位任务和16位TSS结构信息,参见7.6节,“16位任务状态段(TSS)”。64位模式任务管理的具体信息,见7.7节,在64位模式下任务管理。”

7.1任务管理概述

一个任务是一个处理器可以调度,执行,暂停的一个工作单元,可以用来执行一个程序,一个任务或进程,操作系统服务程序,中断或异常处理程序,内核或执行程序。

IA-32体系结构提供保存任务状态机制,从而实现调度任务的执行和任务间切换。在受保护模式下运行时,所有处理器执行均在任务中进行。即使简单的系统也必须定义至少一个任务。更复杂的系统可以使用处理器的任务管理设置以支持多任务应用。

7.1.1任务结构

一个任务由两部分组成:任务执行空间和任务状态段(TSS)。任务执行空间由一个代码段,一个堆栈段,一个或多个数据段构成(参见图7-1),如果操作系统或执行器使用了处理器的特权级保护机制,任务执行空间也为每个权限级别提供单独的堆栈。TSS指定了一些段,这些段构成任务执行空间并提供存储任务状态信息的空间。在多任务系统中,TSS也提供了一个链接任务的机制。

一个任务通过其TSS段的段选择子来辨认。在一个任务被加载到处理器执行时,段选择子,基地址,段限制,和tss属性的段描述符也同时加载到任务寄存器中(见2.4.4,“任务寄存器(TR)”)。如果任务采用了分页机制,则该任务页使用的页目录的基地址被加载到控制寄存器Cr3中。

7.1.2任务状态

下列项目定义当前执行任务的状态:

•任务当前执行空间,通过段寄存器(CS,DS,SS,ES,FS和GS)中的段选择子来定义。

•通用寄存器状态。

 

 

 

 

•EFLAGS寄存器状态。

•EIP寄存器状态。

•控制寄存器Cr3状态。

•任务寄存器状态。

•LDTR寄存器状态。

•I/O映射基地址和I / O映射(包含在TSS)。

•权限为0,1,和2的堆栈指针(包含在TSS)。

•以前执行的任务的链接(包含在TSS)。

在调度任务之前,除了任务寄存器状态,所有这些项目都包含在任务的TSS中。

另外,除了LDT的段选择子,LDTR寄存器的完整内容不包含在TSS段中,。

7.1.3执行任务

软件或处理器可以以下列方式中的一个来调度任务执行:

•一个明确的任务调用指令CAL L。

•一个明确的跳转指令JMP。

•隐式调用(由处理器)到中断处理程序的任务。

•隐式调用一个异常处理程序任务。

•在EFLAGS寄存器的NT位标志置1时,(用IRET指令发起的)的返回。

 

所有这些用于调度任务的方法都通过指向任务门或该任务TSS的一个段选择子来确定被调度任务。当用调用或跳转指令来调度任务,指令中的选择子可以直接指向TSS或包含指向TSS选择子的任务门。调度任务处理异常或中断时,中断或异常的IDT入口必须包含一个任务门,这个任务门包含指向中断或异常处理程序TSS的选择子。

当一个任务被调度执行,任务切换发生在当前运行任务和被调度任务。任务切换时,当前正在执行的任务的执行环境(称为任务的状态或语境)保存在TSS中并暂停任务执行。随后被调度任务的状态加载到处理器并从新加载的EIP寄存器指向的指令处开始执行任务。如果任务因为系统持续初始化而没有运行,EIP将指向该任务的代码第一个指令,或者,它会指向该任务最后执行时的指令的下一条指令。

如果当前执行任务(调用任务)调用被调度的任务(被调用任务),调用任务的TSS段选择子存储在被调用任务的TSS中,从而为调用任务提供一个返回链接。

对IA-32处理器,所有任务是非递归的。任务不能调用或跳转到自身执行。

中断和异常可以通过任务切换到一个处理程序来处理。这时,处理器进行任务切换来处理中断或异常,并自动从中断或异常处理程序切换回被中断任务。该机制还可以处理在中断任务中发生的中断。

作为任务切换的一个部分,处理器也可以切换到另一个LDT,从而允许每个任务有不同的基于LDT映射段的逻辑—物理地址。页目录基址寄存器(CR3)也在任务切换时被更新,允许每个任务都有自己的一套页表。这些保护设施有助于隔离任务和防止它们互相干扰。

 

 

 

如果不使用保护机制,处理器不提供任务间保护。即便使用多个权限级别保护的操作系统也是这样。一个在特权级3运行的任务,如果使用和其它特权级3运行的任务同样的LDT和页表,它就可以访问这些任务的代码,并损坏其它任务的数据和堆栈。

使用任务管理器设置处理多任务应用程序是可选的。可以通过软件来处理多任务,每个软件定义一个在IA-32架构单任务状态中执行的任务。

7.2任务管理数据结构

处理器定义了五个处理任务相关活动的数据结构:

•任务状态段(TSS)。

•任务门描述符。

•TSS描述符。

•任务寄存器。

• EFLAGS 寄存器中的NT 标志

在保护模式下运行时,至少要有一个任务创建一个TSS和TSS描述符,TSS的段选择子必须装入任务寄存器(使用LTR指令)。

7.2.1任务状态段(TSS)

用来恢复任务的处理器状态信息被保存在一个称为任务状态段(TSS)的系统段中。图7-2显示为32位CPU设计的TSS的格式。一个TSS的域被分为两个主要类别:动态域和静态域。对于16位英特尔286位处理器任务的信息结构,参见7.6节,“16位任务状态段(TSS)。”关于64位模式的任务结构,见7.7节,


 

 

 

处理器在任务切换暂停任务时更新动态域。以下是动态域:

•通用寄存器域

- EAX,EBX,ECX,EDX,ESP,EBP,ESI及 EDI寄存器的状态,任务切换前更新。

•段选择子域

存储在ES、CS、SS、DS、FS和GS寄存器中的段选择子,任务切换前更新。

•EFLAGS 寄存器域

EFLAGS 状态,任务切换前更新。

•EIP(指令指针)域

EIP状态,任务切换前更新。。

•前任务链接域

包含以前任务的TSS段选择子(在由调用、中断或异常等指令开始的任务切换时更新)。这个域(有时称为反向链接域)允许一个任务使用IRET指令切换回以前的任务。

处理器读取静态域,但不常规地改变它们。这些域在建立任务的时候被创造。以下是静态域:

•LDT段选择子域

包含任务LDT的段选择子。

•CR3控制寄存器域

包含任务要使用的页目录的物理基址。CR3也被称为页目录基址寄存器(PDBR)。

•特权等级0,1,和2堆栈指针域

这些栈指针包含一个堆栈段(SS0,SS1和SS2)段选择子的逻辑地址,和一个偏移(esp0,ESP1和ESP2)。注意这些域中的值对一个特定的任务来说是静态的,但是,如果在任务中发生堆栈切换, SS 和ESP 将会改变。。

•(调试陷阱)标志(100字节,0位)

置1时,当一个任务切换到这个设置标志的任务时,使处理器产生一个调试异常。参考17.3.1.5”任务切换异常条件”)。

•输入/输出基地址域

包含16位的,从TSS基址到I/O允许位映射和及中断重定向位映射的偏移。该映射存在时,存放在TSS的高地址中。I/O映射基地址指向I/O允许位映射的开始处和中断重定向位映射的结束处。见第17,“输入/输出,”英特尔®64 IA-32架构软件开发者手册,卷1,关于“I/O允许位映射”的更多信息。见20.3节,“中断和异常在虚拟8086模式处理,”详细描述了中断重定向位图。

如果使用分页:

•应避免将处理器在任务切换期间读取的TSS部分(开始的104字节)放置在页面边界。如果边界设置在这个区域,处理器可能无法正确执行地址转换。任务切换时,处理器读取和写入每个任务TSS的第一个104字节(使用从TSS的第一个字节物理地址开始的连续物理地址)。因此,在访问TSS开始时,如果这104个字节的某部分不是物理连续的,处理器会访问到错误的信息,而并不会产生缺页异常。

 

 

 

•切换前任务及当前任务的TSS,和描述符表入口条目的相关页都应该被标记为可读/写。

•如果任务切换初始化前,包含这些结构的页面在内存中,任务切换将进行得更快。

7.2.2 TSS描述符

像所有其他段,TSS,由一个段描述符来定义。图7-3显示了TSS描述符的格式。TSS描述符只能放在GDT;而不能被放置在一个LDT或IDT中。

在调用和转移时(CALLs and JMPs),尝试使用TI标志置1(指示当前使用LDT)的段选择子访问TSS将产生一般保护异常(# GP);使用irets指令时,将产生无效TSS异常(# TS)。如果试图将某个TSS的段选择子载入一个段寄存器,也将产生一般保护异常。

类型域中的繁忙标志 (B)标志指示该任务是否繁忙。一个繁忙的任务是指当前运行或暂停。类型域的值1001B表示任务不活动,1011B表示任务繁忙。

任务不能递归。处理器使用繁忙标志来检测试图对被中断执行任务的调用,以确保只有一个繁忙标志跟一个任务相关,每个TSS应该只有一个指向它的TSS描述符

 

段基址,段限制,DPL域,粒度和存在标志的功能类似于它们在数据段描述符中的作用(见第3.4.5,”段描述符“)。当32位TSS描述符G标志置0,段限制域的值必须等于或大于67H,比最小尺寸的TSS少一个字节。尝试切换到一个TSS 描述符小于67H的任务时,会产生无效TSS异常(# TS)。如果TSS包含I/O许可位映射或操作系统存储另外的数据,需要更大的段限制。任务切换时,处理器不检查大于67H的段限制;然而,当需要访问“I/O许可位映射或中断重定向位映射时,则检查。

任何程序或进程访问一个TSS描述符(当其CPL的数值等于或小于TSS描述符的DPL),可以通过调用或跳转来进行任务调度。

在大多数系统中,TSS描述符的DPLs设置值小于3,因此只有特权软件可以执行任务切换。然而,在多任务应用中,一些TSS描述符的DPLs可以被设置为3,以允许在应用程序(或用户)特权级进行任务切换

 

 

 

 

 

7.2.4任务寄存器

任务寄存器保存16位段选择子和当前任务的TSS完整的段描述符(32位基地址(64位在IA-32e模式),16位的段限制和描述符属性)(见图2-6)。

这些信息从GDT中当前任务的TSS描述符复制。图7-5显示处理器访问TSS使用的路径(使用任务寄存器中的信息)。

任务寄存器有一个可见部分(可被软件读取和改变)和一个看不见的部分(由处理器维护,软件无法访问)。段选择子属于可见部分,指向GDT中的TSS描述符。处理器使用任务寄存器中看不见的部分来缓存TSS的段描述符。将这些值缓存在一个寄存器中,使任务的执行效率更高。LTR(装载任务寄存器)和STR(存储任务寄存器)指令装载和读取任务寄存器的可见部分:LTR指令加载一个在GDT中指向一个TSS描述符的段选择子(源操作数)进任务寄存器。然后,它将TSS描述符中的信息加载入任务寄存器中的不可见部分。LTR是一特权指令,只在CPL为0时执行,在系统初始化过程中使用它对任务寄存器初始化。之后,任务寄存器的内容只能在任务切换时被隐式改变。

STR指令存储任务寄存器可见部分到通用寄存器或内存。为确定目前运行任务,这条指令可以通过任何特权级别代码来执行。然而,通常是仅由操作系统软件在处理器上电或复位时使用,将段选择子及基地址设置为默认值0,段界限被设置为FFFFH;

 

 

7.2.5任务门描述符

任务门描述符为任务提供一种间接保护引用,一个任务(见图7-6)。它可以被放置在G DT,   L D T,  或  I D T中。任务门描述符中的TSS段选择子域指向GDT中的一个TSS描述符,并不使用任务门描述符中段选择子中的RPL。

 

 

 

 

任务切换时,任务门描述符的DPL控制对TSS描述符的访问。当一个程序或进程通过任务门调用或跳转到任务,指向任务门的门选择子的CPL和RPL域值,必须小于或等于任务门描述符的DPL。请注意,当任务门被使用时,并不使用目标任务的TSS描述符的DPL。

 

一个任务可以通过任务门描述符或TSS描述符访问。两种结构都满足以下需要:

•一个任务只有一个繁忙标志的需要

因为任务繁忙标志存储在TSS描述符,每个任务都应只有一个TSS描述符。但是,有可能几个任务门引用相同的TSS描述符。

•选择性访问任务的需要

任务门满足这方面的需要,因为他们可以驻留在LDT,并可以有一个不同于TSS描述符DPL的DPL。没有足够权限访问任务在GDT中的TSS描述符(通常DPL为 0)的程序或进程,可能通过任务门允许访问高DPL任务。任务门为操作系统对特定任务的限制访问提供更大的范围。

•中断或异常被一个独立的任务处理的需要

任务门也可以常驻在IDT,允许中断和异常被处理任务处理。当一个中断或异常向量指向任务门,处理器切换到相应的任务。

图7-7说明在LDT中的一个任务门,在GDT中的任务门,和在IDT中的任务门如何都指向相同的任务

 


 

 

 

7。3任务切换

处理器在遇到下列四种情况之一,将当前任务执行转移到另一个任务中:

•目前程序,任务,或进程执行JMP或CALL指令访问GDT中的一个TSS描述符。

•目前程序,任务,或进程执行JMP或CALL指令访问GDT或 当前LDT中的任务门描述符。

•中断或异常向量指向IDT中的任务门描述符。

•在EFLAGS的 NT标志置1时,当前任务执行iret。

  JMP, CALL,和IRET指令,以及中断和异常,是将程序重定向的所有机制。一个对TSS描述符或任务门(当调用或跳转到一个任务时)的引用,或NT标志的状态(执行iret指令时)确定是否发生任务切换。

在切换到新任务时,处理器执行以下操作:

1. 从一个任务门,或从前任务链接域(用IRET指令发起的任务切换),获得新任务的TSS段选择子,用来作为JMP或CALL指令的操作数。

 

 

 

 

2。检查当前(旧)任务是否允许切换到新任务。数据访问权限的规则适用于JMP和CALL指令。当前(旧)任务CPL和RPL(对新任务的段选择子),必须小于或等于TSS描述符或被引用任务门的DPL。

例外:中断(除外INTn指令产生的中断),和IRET指令允许任务切换,而不考虑目标任务门或TSS描述符的DPL。对于由中断INT n指令产生的中断,则进行DPL检查

3。检查新任务的TSS描述符是否被标记为内存存在,并且界限有效(大于或等于67H)。

4。检查新任务是可用的(调用,跳转,异常或中断),或忙(iret返回)。

5。检查当前(旧)任务TSS、新任务TSS,以及所有用于任务切换的段描述符已经驻留在系统内存页。

6。如果任务切换是通过一个JMP或IRET指令发起,处理器清除当前(旧)任务的TSS描述符中的繁忙(B)标志;如果通过调用指令,异常或中断发起,繁忙(B)标志不重置。(见表7-2。)

7。如果任务切换是从一个IRET指令发起,处理器清除EFLAGS寄存器临时保存镜像 中的 NT标志;如果从一个调用或跳转指令,异常或中断发起,保存镜像中的NT标志保持不变。

8。将(旧)任务当前状态保存在当前任务的TSS。处理器在任务寄存器中寻找到当前TSS的基地址,然后将下列寄存器的状态复制到当前TSS:所有通用寄存器的数据,段寄存器中的段选择子,EFLAGS寄存器的临时存储镜像,(EIP)寄存器中的指令指针。

9。如果任务切换通过调用指令,异常或中断发起,处理器将从新任务中装载的EFLAGS的NT标志置1。如果通过IRET指令和跳转指令发起,NT标志将保持从新任务中装载的EFLAGS的NT状态(见表7-2)。

10。如果任务切换通过调用指令,跳转指令,异常或中断发起,处理器将新任务TSS描述符中繁忙(B)标志置1;如果通过IRET指令发起,繁忙(B)标志不设置。

11。将新任务TSS中的段选择子和描述符,加载入任务寄存器。

12。将TSS状态加载到处理器。包括LDTR寄存器,PDBR(控制寄存器CR3),EFLAGS寄存器,EIP寄存器,通用寄存器和段选择子。任何一个状态的加载故障都可能导致损坏架构状态。(如果不启用分页,PDBR 的值是从新任务的TSS中读取,但并不被装入CR3。)

13。与段选择子相关的描述符被装入并进行合格检验。新任务环境中与此加载和检验相关联的任何错误,都可能会损坏架构状态。

                                                                                        注意

如果所有的检查和保存都已成功执行,处理器将进行任务切换。

如果一个不可恢复的错误发生在步骤1到步骤11,处理器不进行任务切换,应确保处理器能返回启动任务切换指令执行之前的状态。

如果在步骤12中发生不可恢复的错误,架构状态可能已经损坏,但将尝试在之前的执行环境处理错误。

如果一个不可恢复的错误发生在进行任务切换时(步骤13),处理器将完成任务切换(不进行额外的访问和段可用性检查),并在开始执行新任务之前,生成相应的异常。

如果在进行任务切换时发生异常,异常处理程序必须在允许处理器开始执行新任务之前,自己完成任务切换。见6章,“中断10--无效TSS异常(# TS),”当进行任务切换时,发生异常对任务影响的更多信息。

14。开始执行新任务。(对于一个异常处理程序,新任务的第一条指令似乎没有被执行。)当成功的进行任务切换时,当前执行任务的状态总是被保存的。如果任务被恢复,各个寄存器的值恢复到它们在任务被暂停时保存的值,并从保存的EIP值处开始执行指令。

 

 

 

 

在切换任务时,新任务不会从暂停任务中继承它的特权级别。新任务将自己TSS中指定的权限级别,加载入CS寄存器中的CPL域中开始执行。因为任务拥有独立的地址空间和TSS,并且因为特权规则控制对一个TSS的访问,所以进行任务切换时,软件不需要进行显式权限检查。

表7-1表明,当切换任务时,处理器需要检查的异常情况。它还显示了每个检查如果检测到错误,所产生的异常,以及错误代码引用的段。(表中的检查顺序是用在P6系列处理器的顺序。其它IA-32处理器准确的顺序模型可能不同。)处理这些异常的处理程序,如果它们试图重新装载产生异常的段选择子,可能导致递归调用。所以,引起异常的原因(或多种原因的第一个)在处理程序重新装载选择子前,应被处置完毕。

注意:

1. #NP :段不存在(内存)异常, #GP:通用保护异常, #TS :无效TSS 异常, #SS :缺段异常

2. 错误代码中包含在该列中引用的段描述符的索引。.

3. 相容类型(GDT或LDT)中的段选择子是有效的,它在相应表的段限制中占有一个地址,并引用一个相容类型的描述符(例如,CS寄存器中的段选择子,只有当它指向一段代码段描述符时, 才是有效的)‘

每次发生任务切换时,CR0控制寄存器中的TS(任务切换)标志置1。当处理器其它部分产生浮点异常时,系统软件使用TS标志来协调浮点单元的动作。TS标志指示该浮点单元的环境可能与当前任务的不同。见2.5节,“控制寄存器”,对TS标志功能和用途进行了详细的说明。

 

 

 

 

7。4任务链接

TSS的前链接域(有时被称为“反向链接”)和 EFLAGS寄存器中的NT标志用于返回到以前的任务执行。eflags.nt = 1表示当前执行的任务嵌套在另一个任务中执行。

当一个调用指令、中断或异常导致任务切换:处理器复制当前任务(旧任务)TSS的段选择子到新任务的TSS的前任务链接域;并设置eflags.nt = 1。

如果软件使用IRET指令暂停新任务(即新任务执行完毕),处理器检查到eflags.nt = 1;将使用前任务链接域的值返回到以前的任务。见图7-8.当 JMP指令引起任务切换时,新任务是不嵌套的。不使用前任务链接域并且设置eflags.nt = 0。当调度不需要嵌套的新任务时,使用JMP指令。

 

表7-2显示任务切换时,繁忙标志(在TSS段描述符中),NT标志,前任务链接域,和TS标志(位于控制寄存器CR0中)。

NT标志可以被任何特权级别的执行软件修改。程序可能设置了NT标志并执行iret指令。这将导致随意召唤当前任务TSS中前链接域定义的任务。为防止这种虚假的任务切换成功,操作系统需要对每个TSS中的前任务链接域进行初始化,将它们置0

 

 

 

 

 

 

7.4.1

使用繁忙标志防止任务切换时递归,一个TSS只允许一个任务保存一个环境;因此,一旦任务被调用(调度),对任务的递归(或折返)调用的会导致任务当前状态丢失。TSS段描述符中的繁忙标志防止任务切换进行递归,继而损失任务状态信息。

处理器采用如下方式管理繁忙标志:

1。当调度任务时,处理器设置新任务的繁忙标志。

2。如果在任务切换期间,当前任务被放置在一个嵌套链中(任务切换由调用指令、中断或异常发起),当前任务的繁忙标志保留当前设置。

3。切换到新任务时(由调用指令,中断或异常发起),如果新任务繁忙的标志已经设置,处理器产生通用保护异常(# GP)。如果任务切换是由IRET指令发起,不会出现异常,因为处理器预设繁忙标志被设置。

4。当一个任务因为跳转到一个新的任务而被终止(由任务代码中的JMP指令或IRET指令发起),处理器清除繁忙标志,将任务返回“不忙”的状态。

通过禁止任务切换到自身或任务嵌套链中的任何任务,处理器可以防止任务切换进行递归。由于多重调用,中断或异常,被暂停任务的嵌套链可能增长到任意长度。繁忙标志可以防止一个处于这个链中的任务被召唤。

在多处理器配置中,可能会使用“繁忙”标记,因为该处理器在设置或清除“繁忙”标志时会遵循LOCK协议(总线或缓存中)。这个锁防止2个处理器同时调用相同任务。见第8.1.2.1,自动锁定,“在一个多处理器的应用程序设置忙碌标志的更多信息。

7.4.2修改任务链接

在单处理器系统中,存在需要从任务链中删除任务的情况,可使用以下过程删除任务:

1。禁用中断。

2。更改任务(将被移除任务暂停的任务)TSS中的前任务链接域,它假定该任务是被移除任务的任务链中的下一个任务(新任务)。改变前任务链接域,使其指向链中下一个最旧任务或更旧任务的TSS。

3。清除从链中移除任务TSS段描述符中的繁忙(B)标志。如果一个以上的任务被从链中移除,每个任务的繁忙标志都必须被清除。

4。启用中断。

在多重处理系统中,该进程必须添加额外的同步和序列化操作,以确保前任务链接域被更改和繁忙标志被清除时,前任务的TSS和它的段描述符都被锁定。

7.5

任务地址空间

任务的地址空间由任务可访问的段组成。这些段包括代码、数据、堆栈、TSS中引用的系统段,以及任务代码可以访问的其它段。这些段被映射到处理器的线性地址空间,继而被映射到处理器的物理地址空间(直接或分页)。

TSS中的LDT段域可用来使每个任务拥有自己的LDT。如果一个任务拥有自己的LDT,可以将该任务LDT中所有段的段描述符都和该任务进行关联,从而可以允许该任务的地址空间独立于其它任务。

当然几个任务也可以使用同一个LDT。这是一个有效的内存利用方式,允许特定的任务,在不放弃整个系统的保护屏障的前提下,可以进行彼此沟通或控制。

 

 

 

因为所有的任务都访问GDT,也可以通过GDT中的段描述符表来创建共享的段。

如果启用分页,TSS中的CR3寄存器(PDBR)域允许每个任务有自己的一套线性地址到物理地址的映射页表。或者,几个任务可以共享相同的页表

7.5.1

将任务映射到线性和物理地址空间,

任务可通过下列2种方式之一,将其映射到线性地址空间和物理地址空间中:

•所有任务共享一个线性--物理地址空间的映射。

        当分页不可用时,这是唯一的选择,此时,所有线性地址映射到相同的物理地址。启用分页时,这种形式的线性到物理地址空间映射,通过所有任务使用同一个页目录来实现。如果支持需求分页虚拟内存,线性地址空间可能会超过可用的物理空间。

•每个任务拥有自己的线性地址空间,并被映射到物理地址空间。

        这种形式的映射通过每个任务使用不同的页目录来实现。因为PDBR(控制寄存器CR3)在任务切换时被加载,所以每个任务可以有不同的页目录。

不同任务的线性地址空间可能映射到完全不同的值物理地址。如果不同的页目录入口(CR3)指向不同的页表(该页表又指向不同的物理内存页),则任务间不共享物理地址。

不管用哪一种方法映射任务的线性地址空间,所有任务的TSS必须存放于一个物理空间的共享区,该区域所有任务均可访问。这个映射是必需的,当进行任务切换时,处理器在进行读取和更新相关TSS时,TSS的地址映射不会改变。

由GDT映射的线性地址空间也应该被映射到一个物理空间的共享区,否则,就失去使用GDT的目的。

图7-9显示两个任务的线性地址空间通过在物理空间中重叠,来共享页表。

 

 

 

 

7.5.2任务逻辑地址空间

使用下面的技术,创建用于数据段的共享逻辑--物理地址空间映射,从而允许任务之间共享数据,:

•通过GDT中的段描述符

所有任务都能够访问GDT中的段描述符。如果GDT中的一些段描述符指向线性地址空间中的段,映射到物理地址空间中对所有的任务都公用的空间,那么所有的任务可以共享在这些段中的数据和代码。

•通过相同LDT 共享

两个或者更多的任务如果它们TSS中的LDT域指向同一LDT,它们可以使用同一个LDT,。如果一个共享 LDT中的一些段描述符指向的段被映射到一个公用空间的物理地址,那么共享LDT的任务之间可以共享这些段中的数据和代码。这种共享的方法比通过GDT共享更具选择性,因为这种共享可以被特定的任务来限制,系统中的其它任务可能使用不同的、不能访问共享段的LDT。

•通过将不同LDT中的段描述符,映射到线性地址空间中的公用地址空间

如果将每个任务的线性地址空间的这个公用区域,映射到物理的地址空间的同一区域,那么这些段描述符允许这些任务共享段。该段描述符通常被称为别名。这种共享方法比上面列出的更具选择性,因为LDT中的其它段描述符可以指向独立的非共享线性地址

你可能感兴趣的:(Intel® 64 and IA-32 Architectures Software Developer Manuals中文翻译 任务管理)