linux0.00内核剖析之1.系统级体系结构概览

(1)   全局和局部描述符表

在保护模式中所有的内存访问都要通过GDT或一个可选的LDT。GDT和LDT包含称为段描述符的入口,包括属性、段基址和段界限(段就是内存中的一段)。每个段描述符有一个相关联的段选择子,一个段选择子提供段描述符在GDT或LDT中的索引(位置)、一个标志(该选择子指向GDT还是LDT)和访问权限信息。

要访问段中的一个字节,必须提供一个段选择子和一个偏移地址。段选择子提供(指向)GDT或LDT中的一个段描述符,从而处理器获得这个段的基地址。偏移地址提供要访问的字节相对基地址的位置。如果这个段在处理器工作的当前特权级(CPL)上可访问,这个机制可以被用于访问任何合法的代码段、数据段或堆栈段(本质上都是内存中的一部分)。CPL被定义为当前执行的代码段的保护等级。

GDT的线性基地址(这张表的入口地址)存放在GDT寄存器(GDTR)中,LDT的线性基地址(这张表的入口地址)存放在LDT寄存器(LDTR)中。(逻辑地址是程序中产生的地址,比如C语言用取地址符取得的地址;线性地址是逻辑地址加上段地址,是逻辑地址到物理地址变换的中间层)

(2)   系统段、段描述符和门

除了代码段、数据段和堆栈段,系统架构还定义了两个系统段:任务状态段(TSS)和LDT。GDT不被认为是一个段因为它不是用段选择子和段描述符的方式访问的。TSS和LDT有为它们定义的段描述符。

架构还定义了一组被称为门的特殊描述符(调用门、中断门、陷阱门和任务门)。这些门提供了访问可能工作在与应用程序和大多数过程不同特权级上的系统过程的途径。例如要通过调用门访问一个过程(这里的“过程”泛指逻辑单元或代码块,如程序、函数等),调用者提供调用门的选择子,然后处理器对调用门进行访问权限检查,将CPL与调用门和它指向的目标代码段的特权级进行比较。

(3)   任务状态段和任务门

TSS定义了一个任务的执行环境的状态,包括了通用寄存器、段寄存器、EFLAGS寄存器、EIP寄存器和三个堆栈段的带堆栈指针的段选择子(每个特权级一个堆栈)的状态。TSS还包括了和任务以及页结构的基地址相关联的LDT的段选择子。

在保护模式下所有的程序执行都在一个任务中进行,这个任务称为当前任务。当前任务的TSS的段选择子保存在任务寄存器中。

(4)   中断和异常处理

外部中断、软件中断和异常都通过中断描述符表(IDT)处理。IDT保存了一个门描述符的集合,这些门描述符提供了访问中断和异常处理程序的途径。就像GDT一样,IDT也不是一个段。IDT的线性基地址保存在IDT寄存器(IDTR)中。

IDT中的门描述符可以是中断、陷阱或任务门描述符。要访问一个中断或异常的处理程序,处理器首先从内部硬件、外部中断收集器或通过INT, INTO, INT 3或BOUND指令的方式从软件接收中断向量(中断号)。中断向量向IDT提供一个索引。如果被选择的门描述符是一个中断门或陷阱门,则以一种与通过调用门调用过程类似的方式访问处理程序。如果描述符是一个任务门,则通过任务切换访问处理程序。

(5)   内存管理

系统架构支持内存的直接物理寻址或虚拟内存(通过分页机制)。当使用直接物理寻址时,一个线性地址被当作物理地址。当使用分页机制时,所有的代码段、数据段、堆栈段和系统段(包括GDT和IDT)只能用保持在物理内存中的最近访问的页来分页。

页(有时称为页框架)在物理内存中的位置包含在页结构中。这些页结构存在于物理内存中。

页结构的物理基地址包含在CR3寄存器中。页结构中的入口地址决定了页框架的物理基地址、访问权限和内存管理信息。

要使用分页机制,线性地址被分为几部分,这几部分分别提供页结构和页框架中的偏移地址。一个系统可以有一个或多个页结构分层。例如,每个任务都有自己的分层。

(6)   系统寄存器

为了帮助初始化处理器和控制系统操作,系统架构在EFLAGS寄存器和几个系统寄存器中提供了系统标志:

l  系统标志和EFLAGS寄存器中的IOPL域控制任务和模式转换、中断处理、指令跟踪和访问权限。

l  控制寄存器(CR0, CR2, CR3和CR4)包含了多种标志和数据域来控制系统级操作。这些寄存器中的其他标志用来表示对操作系统或执行器内特定处理器能力的支持。

l  调试寄存器允许设置用于调试程序和系统软件的断点。

l  GDTR, LDTR和IDTR寄存器包含了它们各自的表的线性地址和大小(限制)。

l  任务寄存器包含了当前任务的TSS的线性地址和大小。

l  特殊模块寄存器

特殊模块寄存器(MSR)是操作系统和执行程序(即运行在0特权级的代码)主要可用的一组寄存器。这些寄存器控制各种项目,比如调试扩展、性能监视计数器、机器校验架构和内存类型范围(MTRRs)。

大多数系统限制应用程序访问系统寄存器(除EFLAGS寄存器外)。但是系统也可以被设计成所有的程序和过程运行在最高特权级上(0特权级)。在这种情况下,应用程序将被允许修改系统寄存器。

1.    实模式和保护模式转换

保护模式:是处理器固有的操作操作模式。它提供了一组丰富的架构特性、灵活性、高性能和向当前软件的基础回溯的能力。

实地址模式:这个操作模式提供了Intel 8086处理器的编程环境,还有一点扩展(例如切换到保护或系统模式的能力)。

处理器在打开电源或重置之后被置为实地址模式。寄存器CR0中的PE标志控制着处理器工作在实地址模式还是保护模式。将PE标志置为1即可从实地址模式转换到保护模式,重置或将PE标志置为0即可从保护模式转换到实地址模式。

2.    80x86系统指令寄存器

(1)   标志寄存器EFLAGS

EFLAGS寄存器中的系统标志和IOPL域控制着I/O、可屏蔽的硬件中断、调试、任务切换和虚拟8086模式。只有有权限的代码(一般是操作系统或执行代码)被允许修改这些位。

TF:陷阱(第8位)。置1启动单步调试模式,置0关闭单步调试模式。在单步模式中,处理器每执行完一条指令就产生一个调试中断,从而可以看到程序的执行状态。

IF:中断允许(第9位)。控制处理器响应来屏蔽硬件中断请求。该标志置1时响应可屏蔽的硬件中断,置0时禁止可屏蔽的硬件中断。IF标志不影响异常或不可屏蔽中断(NMI)的产生。

IOPL:I/O特权级域(第12、13位)。表示当前运行的程序或任务的I/O特权级(IOPL)。当前运行的程序或任务的CPL必须小于等于IOPL以访问I/O地址空间。

NT:嵌套任务(第14位)。控制中断的和调用的任务链。处理器对通过CALL指令、中断或异常调用初始化的任务的调用设置该标志,对通过IRET指令初始化的任务的返回检查和修改该标志。

RF:继续(第16位)。控制处理器对指令断点条件的响应。置1时该标志暂时使指令断点的调试异常不能产生。

VM:虚拟8086模式(第17位)。置1启动虚拟8086模式,置0返回保护模式。

AC:对齐检查(第18位)。设置该标志和控制寄存器CR0中的AM标志来开启内存引用的对齐检查。

VIF:虚拟中断(第19位)。用于与VIP标志连接。处理器只有当控制寄存器CR4中的VEM或PVI标志为1且IOPL小于3时才识别VIF标志。

VIP:虚拟中断等待(第20位)。被软件置1用于表示中断在等待中,置0表示没有中断在等待中。

ID:标识(第21位)。程序或过程能够置位或清零该表示标明支持CPUID指令。

(2)   内存管理寄存器GDTR, LDTR, IDTR, TR

GDTR:保存着GDT的基地址(保护模式下是32位)和16位的表长。基地址指出GDT第0个字节的线性地址;表长指出表中的字节数。接通电源或处理器重置后,基地址被置为默认值0,表长被置为0FFFFH。作为保护模式处理器初始化过程的一部分,新的基地址必须被载入到GDTR中。

LDTR:保存着LDT 16位的段选择子、基地址(保护模式下是32位)、段大小和描述符属性。基地址指出LDT第0个字节的线性地址;段大小指出段中的字节数。包含LDT的段必须在GDT中有一个段选择子。接通电源或处理器重置后,段选择子和基地址被置为默认值0,表长被置为0FFFFH。

IDTR:保存着IDT的基地址(保护模式下是32位)和16位的表长。基地址指出IDT第0个字节的线性地址;表长指出表中的字节数。接通电源或处理器重置后,基地址被置为默认值0,表长被置为0FFFFH。作为保护模式处理器初始化过程的一部分,寄存器中的基地址和表长可以被改变。

TR:保存着当前任务的TSS 16位的段选择子、基地址(保护模式下是32位)、段大小和描述符属性。选择子引用GDT中TSS的描述符。基地址指出LDT第0个字节的线性地址;段大小指出段中的字节数。接通电源或处理器重置后,段选择子和基地址被置为默认值0,表长被置为0FFFFH。

(3)   控制寄存器CR0至CR3

控制寄存器决定处理器的操作模式和当前执行任务的特征。

CR0:包含控制操作模式和处理器状态的系统控制标志。

CR1:保留

CR2:包含页错误线性地址(导致页错误的线性地址)

CR3:包含页结构层次的基和两个标志(PCD和PWT)的物理地址。

PG:分页(CR0第31位)——置1时使分页有效,置0时使分页无效。当分页无效时,所有的线性地址被当作物理地址。如果PE标志(CR0寄存器的第0位)为0则PG标志无效;当PE标志为0时将PG标志置1将导致通用保护异常(#GP)。

CD:缓存无效(CR0第30位)——当CD和NW标志为0时,处理器的内部(和外部)缓存中全部物理内训的内存位置的缓存有效。

NW:非写直达(CR0第29位)——当NW和CD标志为0时,命中缓存的写操作的写回和写直达有效,并且失效周期有效。

AM:对齐屏蔽(CR0第18位)——置1时自动对齐检查有效。对齐检查只有在AM标志为1、EFLAGS寄存器中的AC标志为1、CPL为3且处理器工作在保护模式或虚拟8086模式时才被执行。

WP:写保护(CR0第16位)——置1时禁止主管级程序写入只读页。

NE:数字错误(CR0第5位)——置1时启用报告x87 FPU错误的固有(内部)机制;置0时启用PC风格的x87 FPU错误报告机制。

ET:扩展类型(CR0第4位)——在奔腾4、Intel Xeon、P6系列和奔腾处理器中保留。在Intel 386、Intel486处理器中,该标志置1表明支持Intel 387 DX数字协处理器指令。

MP:监视协处理器(CR0第1位)——控制WAIT(或FWAIT)指令与TS标志(CR0第3位)交互。如果MP标志置1,WAIT指令将产生一个设备不可用的异常(#NM)如果TS标志也置1.如果MP标志清零,则WAIT指令忽略TS标志的设置。

PE:保护有效(CR0第0位)——置1时启用保护模式,置0时启用实地址模式。该标志不直接使分页有效。它只使段级别保护有效。要使分页有效,PE和PG标志必须都置1.

PCD:页级别缓存失效(CR3第4位)——控制用于访问当前页结构分层的第一个页结构的内存类型。

PWT:页级别写直达(CR3第3位)——同上。

3.    系统指令

LGDT:将GDT的基地址和限制(大小)从内存写入GDTR

SGDT:将GDT的基地址和限制从GDTR读入内存

LIDT:将IDT的基地址和限制从内存写入IDTR

SIDT:将IDT的基地址和限制从IDTR读入内存

LLDT:将LDT的段选择子和段描述符从内存写入LDTR

SLDT:将LDT的段选择子从LDTR读入内存或通用寄存器

LTR:将TSS的段选择子和段描述符从内存写入任务寄存器

STR:将当前任务的TSS的段选择子从任务寄存器读入内存或通用寄存器

以上指令中写(load)指令应用软件不可用,读(store)指令应用软件可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值