#读书笔记1
##1.1系统级体系结构概览
###1.1.1 Global and Local Descriptor Tables
在受保护模式下所有的内存访问都必须经过全局描述符表(GDT)或者是局部描述符表(LDT),表中的项为段描述符。
段描述符包含段的基本地址信息、访问权限、类型和使用信息。
每一个段描述符都有相关联的段选择器,段选择器向使用它的程序提供GDT或者LDT的索引、全局或本地标志(用于选择DT)、访问权限信息。
访问段中字节的必要条件:段选择器和偏移量
段选择器提供对该段(在GDT或LDT中)的段描述符的访问。从段描述符中,处理器获得线性地址空间中段的基本地址。
偏移量提供字节相对于基本地址的位置。
注:该段必须是处理器当前操作拥有访问权限的段
许多段选择器都显示为指向段的直接指针。然而,从段选择器到相关段的实际路径总是通过GDT或LDT。
GDT的基地址保存在GDTR寄存器中,LDT的地址保存在LDTR寄存器中
在IA-32e子模式中,GDTR和LDTR寄存器都扩展到64位宽。
全局和本地描述符表在64位模式下展开,以支持64位的基本地址(16字节的LDT描述符包含64位的基本地址和各种属性)。
在兼容模式下,不展开描述符。
###1.1.2System Segments, Segment Descriptors, and Gates
除代码段、数据段、堆栈段以外,还定义了两个系统段:任务状态段(TSS)和局部描述符表(LDT)※定义了段描述符
GDT不被认为是一个段,因为它不是通过段选择器和段描述符来访问的。
门:一组特殊描述符,包括调用、中断、陷阱、任务
门的作用:为需要更高权限等级的系统过程和处理程序提供受保护的通道,给予这些程序以更高的权限
门一般比当前程序拥有更高的权限等级,通过门调用能获得更多的权限
如果调用需要更改特权级别,处理器会切换到目标特权级别的堆栈。新堆栈的段选择器是从当前正在运行的任务的TSS中获得的。
门还帮助了16位和32位代码段之间的转换,反之亦然。
在IA-32e模式下,以下描述符是16字节描述符(扩展为允许64位):LDT描述符、64位TSS、调用门、中断门和陷阱门。调用门帮助64位模式和兼容模式之间的转换。
IA32e模式不支持任务门。
在特权级别更改时,处理器不会从TSS读取堆栈段选择器。反而将它们设置为NULL。
###1.1.3Task-State Segments and Task Gates
TSS定义了任务执行环境的状态
任务执行状态包括 通用寄存器、段寄存器、EFLAGS寄存器、EIP寄存器、段选择器和三个堆栈指针(每个堆栈对应一个特权等级)
TSS还包括与任务关联的LDT的段选择器和分页结构层次体系的基地址。
所有受保护模式下的程序执行都发生在任务的上下文中(称为当前任务)。当前任务的TSS的段选择器存储在任务寄存器中。
切换任务的最简单方法是调用或跳转到新任务。这里,在CALL或JMP指令中给出了新任务的TSS的段选择器。
在切换任务时,处理器执行以下操作:
1.将当前任务的状态存储在当前TSS中。
2.使用新任务的段选择器加载任务寄存器。
3.通过GDT中的段描述符访问新的TSS
4.将新任务的状态从新的TSS加载到通用寄存器、段寄存器、LDTR、控制寄存器CR3(页结构层级的基地址)、EFLAGS寄存器和EIP寄存器
5.开始执行新任务。
任务也可以通过任务门访问。任务门类似于调用门,只是它提供对TSS的访问(通过段选择器),而不是代码段。
在IA-32e模式下不支持硬件任务切换。然而,TSS仍然存在。TSS的基地址由它的描述符指定。
64位TSS包含以下对64位操作很重要的信息:
1.每个特权级别的堆栈指针地址
2.中断堆栈表的指针地址
3.IO许可位映像的偏移地址(相对TSS的基地址)
在IA-32e模式下,任务寄存器被扩展为能容纳64位基地址。
###1.1.4Interrupt and Exception Handling
外部中断、软件中断和异常都是通过中断描述符表(IDT)处理的。
IDT存储一组门描述符,它们提供对中断和异常处理程序的访问,IDT的线性地址包含在IDT寄存器(IDTR)中。
IDT中的门描述符可以是中断、陷阱或任务门描述符。
为了访问中断或异常处理程序,处理器首先通过INT、INTO、INT 3或BOUND指令从内部硬件、外部中断控制器或软件接收一个中断向量(中断号)。中断向量提供IDT的索引。
如果所选的门描述符是中断门或陷阱门,则以类似于通过调用门调用过程的方式访问关联的处理程序过程。如果描述符是任务门,则通过任务开关访问处理程序。
在IA-32e模式下,中断描述符被扩展到16字节以支持64位的基地址。这适用于64位模式和兼容模式。IDTR寄存器被扩展为容纳64位的基本地址。不支持任务门
###1.1.5Memory Management
系统架构支持内存的直接物理寻址或虚拟内存寻址(通过分页)。
当使用物理寻址时,线性地址被视为物理地址。
当使用分页时:所有代码、数据、堆栈和系统段(包括GDT和IDT)都可以使用物理内存中最近访问的页面进行分页。
页在物理内存中的位置(有时称为页帧)存储在分页结构中。这些结构驻留在物理内存中。
页结构层级的基物理地址存储在在控制寄存器CR3中。分页结构中的条目决定了页框架的基物理地址、访问权限和内存管理信息。
使用这种分页机制时,一个线性地址会被分成若干部分。这些部分在分页结构和页面框架中提供独立的偏移量。一个系统可以有一个或多个分页结构层级。例如,每个任务可以有自己的层级。
在IA-32e模式下,物理内存页由一组系统数据结构管理。在兼容模式和64位模式中,使用了四种级别的系统数据结构:
1.页映射级别4 (PML4): PML4表中的一个条目包含页目录指针表的基物理地址、访问权限和内存管理信息。PML4的基物理地址存储在CR3中。
2.一组页目录指针表: 页目录指针表中的一个条目包含页目录表基物理地址、访问权限和内存管理信息。
3.页目录集: 页目录表中的条目包含页表基物理地址、访问权限和内存管理信息。
4.页表集: 页表中的条目包含页帧的物理地址、访问权限和内存管理信息。
###1.1.6System Registers
1.EFLAGS寄存器中的系统标志和IOPL字段控制任务和模式切换、中断处理、指令跟踪和访问权限。
2.控制寄存器(CR0、CR2、CR3和CR4)存储用于控制系统级操作的各种标志和数据字段。这些寄存器中的其他标志用于指示操作系统或执行程序中对特定处理器功能的支持。
3.调试寄存器允许设置用于调试程序和系统软件的断点。
4.GDTR、LDTR和IDTR寄存器存储各自表的线性地址和大小。
5.任务寄存器存储当前任务的TSS的线性地址和大小。
6.模型相关的寄存器:一组主要用于操作系统或执行程序(最高权限)的寄存器。这些寄存器控制调试扩展、性能监视计数器、机器检查体系结构和内存类型范围等项(数量和功能不同处理器之间存在差异)
大多数系统都限制应用程序对系统寄存器的访问(EFLAGS寄存器除外)。然而,在设计系统时,所有程序和过程都在最特权级(特权级0)上运行。在这种情况下,应用程序将被允许修改系统寄存器。
在IA-32e模式下,四个系统描述表寄存器(GDTR、IDTR、LDTR和TR)在硬件中扩展,以容纳64位的基地址。EFLAGS成为64位RFLAGS寄存器。CR0-CR4扩展为64位。CR8变得可用,CR8提供对任务优先级寄存器(TPR)的读写访问,以便操作系统能够控制外部中断的优先级。在64位模式下,调试寄存器DR0-DR7是64位的。在兼容性模式下,DR0-DR3中的地址匹配也是在64位粒度上完成的。在支持IA-32e模式的系统上,特性启用寄存器的扩展是被允许的。该特定于模型的寄存器控制IA-32e模式和其他IA-32e模式操作的激活。
###1.1.6Other System Resources
性能监视计数器:可以通过编程对处理器事件进行计数,例如解码指令的数量、接收中断的数量或缓存负载的数量。
内部缓存和缓冲区:缓存用于存储数据和指令。缓冲区用于存储系统和应用程序段的解码地址等内容,以及等待执行的写操作。
##1.2操作系统模式
IA-32支持三种工作模式和一种准工作模式:
1.保护模式
这是处理器的本机工作模式。它提供了一组丰富的体系结构特性、灵活性、高性能和对现有软件的向后兼容性。
2.实地址模式(实模式)
这种操作模式提供了Intel 8086处理器的编程环境,有一些扩展(比如切换到受保护或系统管理模式的能力)。
3.系统管理模式(SMM)
SMM是所有IA-32处理器的标准体系结构特性,从Intel386 SL处理器开始。这种模式为操作系统或执行程序提供了一种透明的机制,用于实现电源管理和OEM差异特性。SMM是通过激活外部系统中断引脚(SMI#)来输入的,该引脚会生成一个系统管理中断(SMI)。在SMM中,处理器切换到一个单独的地址空间,同时保存当前运行的程序或任务的上下文。然后可以透明地执行特定于SMM的代码。从SMM返回时,处理器被置回SMI之前的状态
4.虚拟8086模式
在保护模式下,处理器支持称为虚拟8086模式的准操作模式。此模式允许处理器在受保护的多任务环境中执行8086软件。
IA-32e模式
在IA-32e模式下,处理器支持两种子模式:兼容模式和64位模式。64位模式提供64位线性寻址,并支持大于64 gb的物理地址空间。兼容模式允许大多数遗留的受保护模式应用程序不加修改地运行。
Intel 64架构支持IA-32架构和IA-32e模式的所有操作模式
1.在电源启动或复位之后,处理器将处于实地址模式。
2.然后控制寄存器CR0中的PE标志控制处理器是在实地址还是保护模式下运行。(PE置1处于保护模式)
3.EFLAGS寄存器中的VM标志确定处理器是在受保护模式还是在虚拟8086模式下运行。(VM置1处于虚拟8086模式)受保护模式和虚拟8086模式之间的转换通常作为任务切换或从中断或异常处理程序返回的一部分执行。
4.LMA位确定处理器是否在IA-32e模式下运行
当处于IA-32e模式下,代码段的CS.L位决定64位还是兼容子模式
5.通过启用分页(CR0.PG=1)和设置LME位,处理器从受保护模式进入IA-32e模式
6.当处理器处于实地址、受保护、虚拟8086或IA-32e模式时,只要接收到SMI,处理器就切换到SMM。在执行RSM指令时,处理器返回到发生SMI前的模式。
IA32_EFER MSR提供了几个与IA-32e模式启用和操作相关的字段。它还提供了一个与页面访问权限修改相关的字段
比特位 | 描述 |
---|---|
0 | 在64位模式下启用SYSCALL/SYSRET指令 |
7:1 | 保留位 |
8 | 启用IA-32e模式操作 |
9 | 保留位 |
10 | 设置时指示IA-32e模式是活动的 |
11 | 通过防止从设置了XD位的PAE页中获取指令来启用页访问限制 |
63:12 | 保留位 |
##1.38086系统指令寄存器
###1.3.1EFLAGS寄存器
EFLAGS寄存器控制I/O的系统标志、IOPL字段、屏蔽硬件中断、调试、任务切换和虚拟8086模式(参见图2-5)。应该只允许特权代码(通常是操作系统或执行代码)修改这些位。
TF陷阱(第8位)
控制单步调试模式,置1为启用,置0为禁用。在单步模式下,处理器会在每条指令之后生成一个调试异常。这允许在每条指令之后检查程序的执行状态。如果应用程序使用POPF、POPFD或IRET指令设置TF标志,则在
POPF、POPFD或IRET指令之后生成调试异常
IF中断启用(第9位)
控制处理器对屏蔽中断请求的响应,置1为屏蔽硬件中断,置0为禁止屏蔽硬件。中断IF标志不会影响异常或不可屏蔽中断(NMI中断)的生成。控制寄存器CR4中的CPL、IOPL和VME标志的状态决定了IF标志是否可以被指令CLI、STI、POPF、POPFD和IRET修改
IOPLI/O特权级字段(第12和13位)
指示当前运行的程序或任务的I/O特权级别(IOPL)。当前正在运行的程序或任务的CPL必须小于或等于IOPL(即权限高于IO权限)才能访问I/O地址空间。POPF和IRET指令只能在CPL为0时修改这个字段。当虚拟模式扩展生效时(CR4.VEM=1),IOPL也是在虚拟8086模式下控制IF标志修改和中断处理的机制之一.
NT嵌套任务(第14位)
控制中断和调用任务的链接。处理器在调用由调用指令、中断或异常启动的任务时设置此标志。它在IRET指令启动的任务返回时检查和修改此标志。可以通过POPF/POPFD指令显式设置或清除标志(可能产生意外异常)
RF重启(第16位)
控制处理器对指令断点条件的响应。置1暂时禁止为指令断点生成调试异常。RF标志的主要功能是允许在由指令断点条件引起的调试异常之后重新启动一条指令,在成功执行返回的指令之后,处理器会自动清除此标志,再次启用指令断点故障。
VM虚拟8086模式(第17位)
置1启用虚拟8086模式;置0后返回保护模式。
AC对齐检查(第18位)
设置此标志和控制寄存器CR0中的AM标志,以启用内存引用的对齐检查;清除AC标志(和/或)AM标志以禁用对齐检查。当引用一个未对齐的操作数时,例如一个地址为奇数字节的字或一个地址不是4的整数倍的双字,会生成一个对齐检查异常。
VIF虚拟中断(第19位)
包含IF标志的虚拟映像。此标志与VIP标志一起使用。当设置了控制寄存器CR4中的VME标志或PVI标志且IOPL小于3时,处理器才能识别VIF标志
VIP虚拟中断挂起(第20位)
由软件设置,置1表示中断正在等待;置0表示没有中断正在等待。此标志与VIF标志一起使用。处理器读取这个标志,但从不修改它。只有当控制寄存器CR4中的VME标志或PVI标志被设置且IOPL小于3时,处理器才能识别VIP标志。
ID身份认证(第21位)
程序或过程通过设置或清除此标志的能力来表明对CPUID指令的支持。
IA-32e 模式:
在64位模式下,RFLAGS寄存器扩展为64位,保留上32位。RFLAGS(64位模式)或EFLAGS(兼容模式)中的系统标志如图2-5所示。在IA-32e模式下,处理器不允许设置VM位,因为不支持虚拟8086模式(设置该位的尝试将被忽略)。而且,处理器不会设置NT位。但是,处理器允许软件设置NT位。在IA-32e模式下,SYSCALL/SYSRET指令有一个可编程的方法来指定在RFLAGS/EFLAGS中清除哪些位。
###1.3.2内存管理寄存器
处理器提供4个内存管理寄存器(GDTR、LDTR、IDTR和TR),它们指定控制分段内存管理的数据结构的位置。为加载和存储这些寄存器提供了特殊的说明。
全局描述符表寄存器(GDTR)
GDTR寄存器保存GDT的基地址(保护模式下为32位;IA-32e模式下为64位)和GDT的16位表限制。基地址指定了GDT的0字节的线性地址;表限制指定了表中的字节数。在电源启动或处理器复位时,基址设置为默认值0,限制设置为0FFFFH。作为受保护模式操作的处理器初始化过程的一部分,必须将新的基地址加载到GDTR中。
本地描述符表寄存器(LDTR)
LDTR寄存器保存LDT的16位段选择器、基地址(保护模式下为32位,IA-32e模式为64位)、段限制和描述符属性。基地址指定LDT段字节0的线性地址;段限制指定段中的字节数。
包含LDT的段必须在GDT中具有段描述符。当LLDT指令在LDTR中加载段选择器时:LDT描述符中的基址、限制和描述符属性将自动加载到LDTR中。
当任务切换发生时,LDTR将自动加载新任务的LDT的段选择器和描述符。在将新的LDT信息写入寄存器之前,LDTR不会自动保存
在电源启动或处理器复位时,段选择器和基址设置为默认值0,限制设置为0FFFFH。
中断描述符表寄存器(IDTR)
IDTR寄存器保存IDT的基地址(保护模式下为32位,IA-32e模式为64位)和16位表限制。基地址指定IDT的0字节的线性地址;表限制指定表中的字节数。在电源启动或处理器复位时,基址设置为默认值0,限制设置为0FFFFH。寄存器中的基地址和限制可以在处理器初始化过程中被更改。
任务寄存器(TR)
任务寄存器包含16位段选择器、基地址(保护模式下为32位,IA-32e模式为64位)、当前任务的TSS的段限制和描述符属性。选择器在GDT中引用TSS描述符。基地址指定TSS的字节0的线性地址;段限制指定TSS中的字节数。
当LTR指令在任务寄存器中加载段选择器时,来自TSS描述符的基本地址、限制和描述符属性将自动加载到任务寄存器中。在电源启动或处理器复位时,基址设置为默认值0,限制设置为0FFFFH。
一个任务切换发生时,任务寄存器会自动加载新的任务的段选择器和TSS描述符。在将新的TSS信息写入寄存器之前,任务寄存器不会自动保存
###1.3.3控制寄存器
控制寄存器(CR0、CR1、CR2、CR3和CR4)决定处理器的工作模式和当前正在执行的任务的特征。这些寄存器在所有32位模式和兼容模式下都是32位的。在64位模式下,控制寄存器扩展为64位。MOV CRn指令用于操作寄存器位。这些指令的操作数大小前缀将被忽略。
CR0
包含控制处理器的操作模式和状态的系统控制标志。
CR1
保留
CR2
包含导致页面错误的线性地址
CR3
包含页结构层级的基物理地址和两个标志(PCD和PWT)。CR3只指定基址的最高有效位(减去较低的12位),地址的下12位被认为是0。因此,第一个分页结构必须与页面(4-KByte)边界对齐。PCD和PWT标志控制在处理器的内部数据缓存中分页结构的缓存(它们不控制页目录信息的TLB缓存)。当使用物理地址扩展时,CR3寄存器包含页目录指针表在IA-32e模式下的基地址,CR3寄存器包含PML4表的基地址。
CR4
包含一组标志,这些标志支持多个架构扩展,并指示操作系统或执行程序对特定处理器功能的支持。
CR8
提供对任务优先级寄存器(TPR)的读写访问。
加载控制寄存器时,应始终将保留位设置为先前读取的值。
以下为控制寄存器中的一些标志:
PG 分页(CR0的第31位)
置1时启用分页;置0时禁用分页。当分页被禁用时,所有的线性地址都被视为物理地址。如果不同时设置PE标志(CR0的第0位),PG标志将不起作用;在PE标志为0时设置PG标志会导致通用保护异常。
在Intel 64处理器上,启用和禁用IA-32e模式操作还需要修改PG
CD 禁用缓存(CR0的第30位)
当CD和NW标志清除时,对处理器内部缓存的全部物理内存位置的缓存是启用的
当设置CD标志时,缓存将受到限制。
NW 禁用写回(CR0的第29位)
当NW和CD标志清除时,写回对于命中缓存的写启用,并且启用无效循环。
NW 校准掩码(CR0的第18位)
设置时可以自动校准;清除时禁用对齐检查。只有当设置了AM标志,设置了EFLAGS寄存器中的AC标志,特权等级为3,并且处理器在保护模式或虚拟8086模式下运行时,才会执行对齐检查。
WP 写入保护(CR0的第16位)
置1时,禁止管理级过程写入只读页面;当清除(置0)时,允许管理级程序写入只读页面(不管U/S位设置如何)此标志有助于实现创建UNIX等操作系统使用的新进程的即写即拷方法。
NE 数字错误(CR0的第5位)
启用本机内部机制,在设置时报告x87 FPU错误;在清除时启用pc风格的x87 FPU错误报告机制。当NE标志清除并且断言IGNNE#输入时,x87 FPU错误将被忽略。当NE标志被清除且IGNNE#输入被取消时,一个未被掩盖的x87 FPU错误导致处理器来产生一个外部中断,并在执行下一条等待的浮点指令或WAIT/FWAIT指令之前立即停止指令执行。
ET、TS、EM、MP 共同控制了浮点协处理器的操作
ET 扩展类型(CR0的第4位)
保留在Pentium 4、Intel Xeon、P6家族和Pentium处理器中。在Pentium 4、Intel Xeon和P6系列处理器中,这个标志被硬编码为1。在Intel386和Intel486处理器中,这个标记表示在设置时支持Intel 387 DX math协处理器指令。
TS 任务切换(CR0的第3位)
EM 模拟(CR0的第2位)
用于选择与协处理器进行通信所使用的协议,即指明系统中是用的是80386还是80286协处理器
MP 算数存在(CR0的第1位)
当处理器复位时,ET位被初始化,以指示系统中数字协处理器的类型。如果系统中存在 80387协处理器,那么ET位置1;如果系统中存在80287协处理器或者不存在协处理器,那么ET位清0。
EM位控制浮点指令的执行是用软件模拟,还是由硬件执行。EM=0时,硬件控制浮点指令传送到协处理器;EM=1时,浮点指令由软件模拟。
TS 位用于加快任务的切换,通过在必要时才进行协处理器切换的方法实现这一目的。每当进行任务切换时,处理器把TS置1。TS=1时,浮点指令将产生设备不可用(DNA)异常。
MP位控制WAIT指令在TS=1时,是否产生DNA异常。MP=1和TS=1时,WAIT产生异常;MP=0时,WAIT指令忽略 TS条件,不产生异常。
PE 保护启用(CR0的第0位)
设置时启用保护模式;在清除时启用实地址模式。此标志不直接启用分页。它只支持分段级保护。启用分页功能时,必须同时设置PE和PG标志。
PCD 页级缓存禁用(CR3的第4位)
PWT 页级写回(CR3的第3位)
控制用于访问当前页结构层次结构的第一个分页结构的内存类型。如果禁用分页,则不使用此两位,如果CR4.PCIDE=1,则使用PAE分页,或者使用IA-32e分页。
##1.4相关的系统指令
系统指令处理系统级功能,如加载系统寄存器、管理缓存、管理中断或设置调试寄存器。
###1.4.1加载和存储系统寄存器的相关指令
LGDT(Load GDTR Register) 将GDT的基地址和限制从内存加载到GDTR寄存器.
SGDT(Store GDTR Register) 将GDT的基地址和限制从GDTR寄存器保存到内存.
LIDT(Load IDTR Register) 将IDT的基地址和限制从内存加载到GDTR寄存器.
SIDT(Store IDTR Register) 将IDT的基地址和限制从GDTR寄存器保存到内存.
LLDT(Load LDTR Register) 将LDT段选择器和段描述符从内存加载到LDTR寄存器.
SLDT(Store LDTR Register) 将LDT段选择器和段描述符从LDTR寄存器保存到内存或通用寄存器中.
LTR(Load Task Register) 将TSS的段选择器和段描述符从内存加载到任务寄存器.
STR(Store Task Register) 将当前任务TSS的段选择器和段描述符从任务寄存器保存到内存或通用寄存器中.
LMSW(加载机器状态字)和SMSW(存储机器状态字)指令对控制寄存器CR0的0到15位进行操作。这些是为了与16位Intel 286处理器兼容而提供的。而写在32位的IA-32处理器上运行的程序不应该使用这些指令,它们应该使用MOV指令访问控制寄存器CR0。
LDTR寄存器保存到内存或通用寄存器中.
LTR(Load Task Register) 将TSS的段选择器和段描述符从内存加载到任务寄存器.
STR(Store Task Register) 将当前任务TSS的段选择器和段描述符从任务寄存器保存到内存或通用寄存器中.
LMSW(加载机器状态字)和SMSW(存储机器状态字)指令对控制寄存器CR0的0到15位进行操作。这些是为了与16位Intel 286处理器兼容而提供的。而写在32位的IA-32处理器上运行的程序不应该使用这些指令,它们应该使用MOV指令访问控制寄存器CR0。
CLTS (清除CR0中的TS标志)指令用于处理设备不可用的异常