IA-32 Intel手册学习笔记(一)系统架构概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35261315/article/details/78479523

IA-32系统级架构是由寄存器、数据结构、指令组成。用来支持系统级别的操作,比如内存管理,终端和异常处理,任务管理和多处理器控制等。可以看出架构的这些部分和操作系统联系非常紧密,自然而然为操作系统提供了广泛的支持。

下图提供了对IA-32中32位系统寄存器和数据结构的整体概述
这里写图片描述

全局和局部描述符表(Global and Local Descriptor Tables)

传统的实地址模式下的汇编中,利用CS:IP来访问内存,CS左移四位加IP获得物理地址,但是通常不需要关心基地址,只需要偏移地址即可访问内存,因为实地址模式的基地址通常是固定的。但是在保护模式下,为了达到保护内存的目的,就需要让不同程序有不同的基地址(基地址如果固定,那么很容易就被他人直到程序的运行位置,很不安全)。

所以,在保护模式下,内存是一段一段分配的,分配的那一段内存头地址就是基地址,也称段地址。同时,操作系统也需要记录分配出去的每一段内存,实际上,每段内存都使用一个8字节的段描述符记录着,所有的这些段描述符被放在一块连续内存空间中存储着,称为描述符表。

当系统在保护模式下运行时,所有的内存操作都需要通过全局描述符表(GDT)局部描述符表(LDT)来完成。这两个描述符表有好多好多段描述符(segment descriptors),段描述符提供了若干信息,包括

  • 段的基地址
  • 访问权限
  • 类型
  • 用法

每个段描述符都有和它相关联的段选择符(segment selector),段选择符提供了如下信息

  • 索引,提供段描述符在全局/局部描述符表中的偏移量(下标)
  • 全局/局部的标识符,用来标识这个选择符是指向GDT还是LDT
  • 访问权限信息

总结,全局/局部描述符表相当于一个数组,数组元素是段描述符,而每个段描述符对应一个段选择符,这个段选择符就相当于是数组下标,记录段描述符在全局/局部描述符表中的位置。另外,段选择符不在描述符表里。

如上所述,段选择符提供了段描述符的位置,也就是说,如果此刻手里有段选择符,那么就可以知道与它关联的那个段描述符在GDT/LDT中的位置。根据开头的描述,知道段描述符就等于知道内存段的基地址,但是光有基地址是不够的,访问内存还需要偏移地址,这就回到了最开始的部分,保护模式下访问内存,需要基地址和偏移地址两个地址。
其实,保护模式下的CS仍然是16位的,IP变为EIP,是32位寄存器。此时CS就是段选择符,而EIP相当于偏移量,通过CS在描述符表中找到段描述符从而找到基地址,加上EIP表示的偏移量,成功寻址。

如果当前运行的处理器特权级(CPL-Current Privilege Level)有访问段的权限的话,就可以通过这种机制来访问在GDT(全局描述符表)或LDT(局部描述符表)中的各种合法代码,数据和堆栈。
注:CPL被定义为当前执行代码段的保护级

段选择符提供了段描述符,段描述符提供了基地址,再加上偏移量,就可以找到某个段内存中的某个字节(byte)

此外,段描述符也可以表示LDT段(局部描述符表也是一个段),访问LDT需要使用段选择符,找到GDT中的段描述符,从而找到LDT。同时,为了减少访问LDT时进行的段转换次数,LDT的段选择符,段基地址,段限长都会放在LDTR寄存器中。

  • 全局描述符表只是一个数据结构,用来存储描述符,不是段,所以它本身没有段选择符和段描述符。
  • 局部描述符表是一个段,有段选择符和段描述符,段描述符存在全局描述符表中。
  • 全局描述符表的线性基地址存放在寄存器GDTR中

只要是段,都需要用一个段描述符表示,而每个段描述符也必定会有一个与之关联的段选择符


系统段,系统描述符和门(System Segments, Segment Descriptors, and Gates)

除了代码,数据和堆栈段是构成程序运行的环境外,系统架构还定义了两个系统段(System Segments):任务状态段(TSS)和局部描述符表段(LDT)。和上面一样,每个段都有一个段描述符和段选择符,TSS和LDT也有,但是,全局描述符表(GDT)没有段描述符和段选择符,导致它不是系统段的成员。另外,任务状态段(TSS)也在GDT中

此外,除了段描述符,系统架构也提供了一些门描述符,包括

  • 调用门(call gates)
  • 中断门(interrupt gates)
  • 陷阱们(trap gates)
  • 任务门(task gates)

门描述符主要由以下几部分组成

  • 选择子
  • 偏移地址
  • DPL

这里写图片描述

调用门用于在不同特权级之间实现受控的程序控制转移,通常仅用于使用特权级保护机制的操作系统中。本质上调用门只是一个描述符,一个不同于代码段和数据段的描述符,可以放在GDT或者LDT中,但是不能放在IDT(中断描述符表)中。选择子和偏移地址指定了一个线性地址,程序正是通过这个地址进行转移的。

如图,程序通常使用call,jmp指令访问调用门,这些指令中的选择符可以用来指定调用门,在调用门中使用段基址和偏移值计算代码程序的入口地址。而指令中提供的偏移值没有任何用处。

任务状态段和任务门(Task-State Segment and Task Gates)

任务状态段(TSS)定义了任务执行环境的状态。这些状态包括通用寄存器、段寄存器、EFLAGS寄存器、EIP寄存器、段选择符以及三个堆栈段(特权级别0,1,2各一个堆栈)的指针状态。它也包括了与任务相应的LDT的选择符和页表基地址。

任务门用于指示任务,任务门的选择子必须指示GDT中的任务状态段(TSS)描述符,门中的偏移地址无意义。任务的入口点保存在TSS中。利用段间转移指令JMP和段间调用指令CALL访问任务门可以实现任务切换。

在任务切换时,处理器按照下面的次序进行:

  1. 保存当前TSS中当前任务的状态
  2. 装载新任务段选择符的任务寄存器
  3. 通过GDT中段描述符访问新的TSS
  4. 将新TSS中新任务的状态装载到通用寄存器、段寄存器、LDTR、控制寄存器CR3(页表基地址)、EFLAGS寄存器和EIP寄存器
  5. 开始执行新任务

中断和异常处理(Interrupt and Exception Handing)

外部中断、软件中断和异常是通过中断描述符表(IDT)处理的。IDT包含了访问中断和异常处理程序的门描述符表的集合。向GDT一样,IDT也不是一个段,IDT的线性基地址包含在IDT寄存器(IDTR)中,整个中断的寻址过程如下:

  1. 根据IDTR获取中断向量表的基地址
  2. 根据CPU获取的中断向量号(如INT n操作)得到IDT中的某个表项,即某个门描述符
  3. 解析获得的门描述符,通常是中断门或者陷阱门,也可以是任务门
  4. 从门描述符中获得段选择子
  5. 根据段选择子,GDT,LDT获取中断程序的内存地址
  6. 执行中断程序

内存管理(Memory Management)

系统架构既支持物理地址内存,也支持虚拟内存(通过分页实现)。当使用物理内存时,线性地址就是物理地址。当使用虚拟内存时,所有的代码,堆栈,系统段,GDT,IDT都可以通过分页保存在内存中。

处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),这些寄存器指明了那些控制分段内存的数据结构的位置。

全局描述符表寄存器(GDTR)

  • 保存全局描述符表(GDT)的32位基地址和16位的界限,基地址是GDT的线性地址,界限是GDT表中的字节数。
  • 可以通过指令LGDT和SGDT来装载和保存GDTR寄存器的值。
  • 当处理器上电或复位的瞬间,GDTR的基地址被缺省赋值为0,表界限设置为FFFFH(因为上电和复位时还处于实地址模式)。
  • 在初始化的过程中,如果是保护模式的操作,那么会为GRTR的基地址赋上新值

局部描述符表寄存器(LDTR)

  • 保存了16位段选择符,32位基地址,16位段限界和LDT描述符属性。基地址就是LDT的线性地址,段界限是指段中的字节个数。
  • 段选择符用来在GDT中定位局部描述符表
  • 可以通过指令LLDT和SLDT来装载和保存LDTR寄存器的值。
  • 当LLDT指令装载一个LDTR中的段选择符时,LDT描述符的基地址,界限和描述符属性就自动装载到LDTR中。
  • 当进行任务切换时,LDTR就会自动被装载上新任务的段选择符和描述符。
  • LDTR中的段选择符中保存LDT段描述符在GTR中的位置,通过LDTR的段选择符可以找到LDT段描述符
  • 通过LDT段描述符就可以找到LDT段

中断描述符表寄存器(IDTR)

  • 保存中断描述符表(IDT)的32位基地址和16位表界限。基地址是IDT的线性地址,表界限是表中的字节个数
  • 可以通过指令LIDT和SIDT来装载和保存IDTR寄存器的值

任务寄存器(TR)

  • 保存着16位的段描述符,32位基地址,16位段界限和当前任务的TSS描述符属性。
  • 可以通过指令LTR和STR来装载和保存任务寄存器段选择符部分

控制寄存器(Control Registers)

控制寄存器(CR0,CR1,CR2,CR3和CR4)决定了处理器的运行模式和当前正在执行任务的特征,具体如下:

  • CR0:包含系统控制标志,这些标志控制着处理器的运行模式和状态
  • CR1:保留
  • CR2:包含缺页的线性地址(引起缺页的线性地址)
  • CR3:包含了页目录的基地址和两个标志(PCD和PWT)

系统寄存器(System Registers)

为了有助于初始化处理器及控制系统的运行,架构在EFLAGES寄存器内提供了系统标志和几个系统寄存器:

  • EFLAGES寄存器内的系统标志和IOPL域,控制着任务和模式切换、中断处理、指令跟踪和访问特权。
  • 控制寄存器(CR0、CR2、CR4)包含了若干标志和数据域用 于控制系统级的操作。这些寄存器内的其他标志指明了操作系统对处理器的兼容。
  • 调试寄存器允许在调试软件和系统软件内设置断点。
  • GDTR、LDTR和IDTR寄存器内包含了各个表的线性地址和界限。
  • 任务寄存器包含了当前任务的TSS的线性地址和界限。
  • 模式相关的寄存器,主要被操作系统使用的寄存器(代码运行在特权级别为0下),这些寄存器控制着如何调试扩展、性能监测计数器、机器检测架构和内存类型范围这些寄存器的个数和功能。
展开阅读全文

没有更多推荐了,返回首页