(转自 : http://blog.csdn.net/lihenair/article/details/5168396)
Intel Architecture Software Developer’s Manual Volum 3A: SystemProgramming Guide
段描述符的作用是将代码,数据,堆栈和任务状态段的虚拟地址转换成线性地址,并指明段的类型。段描述符只在局部和全局描述符表中出现。
选择符16位长,放在段寄存器中,指针的之一部分是用来在全局或局部描述符表中选择一个描述符,以便确定一个虚拟地址空间中的一个特定的存储器段,故叫选择符。
LDT用于描述相应程序的代码段、数据段和堆栈段。GDT描述系统段,包括操作系统代码和数据。
GDT LDT GDTR LDTR
Global and Local Descriptor Tables
当工作在保护模式时,所有存储器访问都经过全局描述表(GDT)或者一个可选的局部描述表(LDT)。这些表包含的条目称为段描述符。段描述符提供段基址及段访问权限,段类型和使用信息。
每个段描述符都有一个对应的段选择符。一个段选择符提供了它在GDT或LDT中的索引(对应的段描述符的偏移量),一个全局/局部flag(决定选择符指向GDT或LDT)和访问权限信息。
访问段中的一个字节(byte)必须提供一个段选择符和一个偏移量(offset)。段选择符提供访问段描述符的方法(在GDT或LDT中)。从段描述符,处理器得到线性空间中的段基址。偏移量提供了相对于基址的以字节(byte)为单位的位置。这种机制可用于访问任何有效的代码去,数据区或者堆栈段,并提供了在处理器工作时根据当前优先级(CPL)可访问的段。CPL被定义为当前执行代码段的保护级别。
GDT的线性地址的基址位于GDT寄存器(GDTR)中;LDT的线性地址的基址位于LDT寄存器(LDTR)中;
Global and Local Descriptor Tables in IA-32e Mode
System Segments, Segment Descriptors, and Gates
除了构成程序或过程执行环境代码段,数据段和堆栈段,架构还定义了两个系统段: 任务状态段(TSS)和LDT。GDT不被认为是一个段是因为它不可通过段选择符和段描述符访问。TSSs和LDTs有段描述符定义它们。
架构还定义了一组特殊的描述符,称为门(call gates, interrupt gates, trap gates and task gates).这些门提供了保护系统程序和handler的方法。系统程序和handler可能工作在与应用程序和很多程序不同的优先级上。例如,调用门的请求可以提供访问一个在代码段的程序的方法,而这个代码段可能与当权代码段同级或数字上低优先级。为了由调用门访问程序,调用过程提供调用门的选择符。处理器接着执行调用门的访问权检查,比较调用门的优先级CPL和调用门指向的目的代码段。
如果允许访问的目的代码段,则处理器会得到目的代码段的段选择符和代码段在调用门中的偏移量。如果请求需要改变优先级,处理器还会切换到目标优先级的堆栈。新栈的段选择符从当前执行任务的TSS获得。门可以方便的在16位和32为代码段转换,反之亦然。
Task-State Segments and Task Gates
TSS定义了任务的执行环境状态。包括通用目的寄存器,段寄存器,EFLAG寄存器,EIP寄存器和特权级为0、1和2的堆栈段选择符和指针。TSS还包括代表LDT对应任务的段选择符和和页结构层次的基址。
所有在保护模式执行的程序都运行在任务(成为当前任务)的上下文境中。代表当前任务TSS的段选择符存储在任务寄存器中。最简单的任务切换方法使用call或jump到新任务。这一点上,新任务的TSS的段选择符由CALL或JMP指令给出。切换任务时,处理器执行如下操作:
1. 储存保持在当前TSS中当前任务的状态
2. 装载新任务的段选择符到任务寄存器
3. 通过GDT中的任务描述符访问新TSS
4. 从新TSS装载新任务状态到通用目的寄存器,段寄存器,LDTR控制寄存器CR3(页结构层次的基址),EFLAG寄存器和EIP寄存器。
5. 开始执行新任务
任务也可以由任务门访问。任务门与调用门类似,除了它提供的是访问TSS的方法而不是代码段。
Interrupt and Exception Handling
外部中断,软中断和异常由中断描述符表(IDT)处理。IDT存储门描述符的集合,这些描述符提供访问中断和异常处理程序的方法。如同GDT,IDT也不是一个段。代表IDT基址的线性地址包含着IDT寄存器(IDTR)中。
IDT中的门描述符可以是中断,陷阱或者任务门描述符。为了访问中断或异常描述符,处理器首先从内部硬件,外部中断控制器或INT,INTO,INT 3, BOUND中接受一个中断向量(中断号)。中断向量提供了IDT中的索引。如果选择的门描述符是一个中断门或陷阱门,对应的处理函数由类似请求调用门的操作访问。如果描述符是任务门,处理函数由任务切换访问。
Memory-Management Registers
处理器提供4个存储器管理寄存器(GDTR,LDTR,IDTR,TR)。
Global Descriptor Table Register(GDTR)
GDTR寄存器保存GDT的实模式32位基址和16位限长。基址指明了GDT 0字节的线性地址;表限长指明了表中的字节数。
上电或重启处理器后,基址置为默认值0,限长置为0FFFFH。新基址在处理器初始化保护模式操作时装入GDTR。
Local Descriptor Table Register(LDTR)
LDTR寄存器保存LDT的16位段选择符,基址(保护模式32位),段限长和描述符属性。基址指明了GDT 0字节的线性地址;表限长指明了表中的字节数。包含LDT的段必须在GDT中有一个段描述符。
当任务切换时,LDTR自动装入新任务LDT的段选择符和描述符。
上电或重启处理器后,基址置为默认值0,限长置为0FFFFH。新基址在处理器初始化保护模式操作时装入GDTR。
Memory Management Overview
存储器管理功能分为两个部分:分段和分页。分段提供了隔离单独代码,数据和堆栈模块的机制,因此多个程序(或任务)可以在同一个处理器山执行而不被其他处理器打扰。分页提供了实现常规页请求,虚拟存储器系统(程序执行环境部分可以按需映射到物理地址中)的机制,分页还可以用来分割多任务。
每个系统必须定义一个GDT,可被系统中所有程序和任务使用。可选地,一个或多个LDT可定义。例如,一个LDT可以为每个单独的任务定义,或一些或所以任务共享相同的LDT。
GDT自己不是一个段;相反,它是一个在线性地址空间的数据结构。GDT的线性基址和限长必须装入GDTR寄存器中。GDT的基址必须以8字节对齐以换取最好的处理器性能。GDT的限长以字节代表。如同其他段一样,