Chapter10_4 80x86保护模式原理与结构
- 格式:ppt
- 大小:1.90 MB
- 文档页数:102
在IA32下,CPU有两种工作模式:实模式和保护模式。
在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。
计算公式如下:物理地址= 段值*16 + 偏移其中段值和偏移都是16位的,这样通过“段:偏移”的方式达到了1MB的寻址能力。
在保护模式下,寄存器是32位的,但是为了兼容性,地址仍然用“段:偏移”的方式来表示,只不过这时的保护模式下的“段”的概念已经发生了根本的改变,虽然段值仍然由原来的cs、ds等寄存器表示,但是此时它仅仅是一个索引,叫做选择子,指向一个数据结构(叫做GDT,Global Descriptor Table全局描述符表或者LDT,Local Descriptor Table局部描述符表)的一个表项(叫做Descriptor描述符)。
1.全局描述符表寄存器GDTR(/u/16292/showart_396896.html)GDTR长48位,其中高32位为基地址,低16位为界限。
由于GDT 不能有GDT本身之内的描述符进行描述定义,所以处理器采用GDTR为GDT这一特殊的系统段提供一个伪描述符。
GDTR给定了GDT,如下图所示。
GDTR中的段界限以字节为单位。
由于段选择子中只有13位作为描述符索引,而每个描述符长8个字节,所以用16位的界限足够。
2.局部描述符表寄存器LDTR局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDT。
LDTR类似于段寄存器,由程序员可见的16位的寄存器和程序员不可见的高速缓冲寄存器组成。
实际上,每个任务的局部描述符表LDT作为系统的一个特殊段,由一个描述符描述。
而用于描述符LDT 的描述符存放在GDT中。
在初始化或任务切换过程中,把描述符对应任务LDT的描述符的选择子装入LDTR,处理器根据装入LDTR可见部分的选择子,从GDT中取出对应的描述符,并把LDT的基地址、界限和属性等信息保存到LDTR的不可见的高速缓冲寄存器中。
80X86保护模式及其编程(⼀)80x86系统寄存器和系统指令1、标志寄存器(EFLAGS)标志寄存器EFLAGS的标志位含义如下图:TF 位8是跟踪标志(Trace flag),当设置该位时可为调试操作启动单步执⾏⽅式。
复位时则禁⽌单步执⾏。
在单步执⾏⽅式下,处理器会在每个指令执⾏后产⽣⼀个调试异常,这样我们可以观察执⾏程序在每条指令执⾏后的状态。
IOPL 位13-12时I/O特权级(I/O Privilege Level)字段。
该字段指明当前运⾏程序或任务的I/O特权级别IOPL。
当前任务或程序的CPL必须⼩于这个IOPL才能访问I/O地址空间。
只有当CPL位特权级0时,程序才可以使⽤POPF或IRET指令修改这个字段,IOPL也是控制对IF标志修改的机制之⼀NT 位14是嵌套任务标志(Nested Task)。
它控制着被中断任务和调⽤任务之间的链接关系。
在使⽤CALL指令、中断或异常执⾏任务调⽤时,处理器会设置该标志,在通过IRET指令从⼀个任务返回时,处理器会检查并修改这个NT标志。
使⽤POPF/POPFD指令也可以修改这个标志,但是在应⽤程序中改变这个标志的状态会产⽣不可意料的异常RF 位16时恢复标志(Resume Flag)。
该标志⽤于控制处理器对断点指令的响应。
当设置时,这个标志会临时禁⽌断点指令产⽣调试异常;当标志复位时,则断点指令将会产⽣异常。
RF的主要功能是允许调试异常后重⾏执⾏⼀条指令。
当调试软件使⽤IRETD指令返回被中断程序之前,需要设置堆栈上EFLAGS内容中的RF标志,以防⽌指令断点造成另⼀个异常,处理器会在指令返回之后⾃动清除该标志,从⽽再次允许指令断点异常。
VM位17是虚拟-8086⽅式标志,当设置该标志时,新开启虚拟-8086⽅式,当复位该标志时,则回到保护模式内存管理寄存器处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),⽤于指定分段内存管理所使⽤的系统表的基地址,其中包含有分段机制的重要信息。
Intel 80x86 保護模式架構緒論Intel Architecture 架構概觀Intel Architecture 又稱x86 架構,因為它的第一代處理器的代號是8086,而其後繼產品依序以8088、80186、80188、80286……為代號,均為80x86 的形式;而在80286 之後,Intel 改以i386、i486 來命名,因此才被稱為x86 架構。
在i486 處理器之後,Intel 就不再以x86 的形式命名,所以在這裡以較正式的Intel Architecture 來稱呼這個架構(簡稱IA 架構)。
Intel Architecture 系列的處理器中,最早的8086 是一16 bit 的處理器,具有16 bit 的暫存器和data bus,並具有20 bit 的定址能力,能定址最多達1MB 的記憶體,在當時算是相當大的數目。
然而,20 bit 的位址和16 bit 的暫存器無法相符,因此Intel 設計了一種segment:offset 的定址方式,利用兩個16 bit 暫存器來表示一個20 bit 的位址。
到了80286 的時代,1MB 的定址能力已經不敷使用,因此Intel 為它設計了一個新的「保護模式」(Protected Mode),並將原先8086 所使用的方式稱為「實際模式」(Real Mode)。
80286 具有24 bit 的定址能力,可以定址16MB 的記憶體,但是只有在保護模式下才能發揮。
在實際模式中,為了維持和8086 的相容性(這點是Intel 非常堅持的),還是只能使用1MB 的記憶體。
80286 的保護模式已經有了多工作業的能力,並且可以保護各個節區的資料和程式不被其它程式干擾。
IBM 的OS/2 1.x 和Microsoft 的Windows 3.x 都有支援這個模式。
在i386 出現時,情形有很大的變化。
i386 是一個32 bit 的處理器,並具有32 bit 的定址能力,可以定址達4GB 的記憶體。
80x86 保护运行模式80386 概述80386 是一个高级的32 位微处理器,专门用于多任务的操作系统,并为需要高性能的应用所设计。
32位的寄存器和数据通道支持32 位的寻址方式和数据类型,处理器可以寻址最高可达4GB 的物理内存以及64TB(246字节)的虚拟内存。
芯片上的内存管理包括地址转换寄存器、高级多任务硬件、保护机制以及分页虚拟内存机制。
下面针对系统编程,概要说明使用80386 的这些基本原理。
系统寄存器设计用于系统编程的系统寄存器主要包括以下几类:标志寄存器EFALGS;内存管理寄存器;控制寄存器;调试寄存器;测试寄存器。
系统标志寄存器EFLAGS 控制着I/O、可屏蔽中断、调试、任务切换以及保护模式和多任务环境下虚拟8086 程序的执行。
其中主要标志见下图所示。
31 23 15 7 00 0 0 0 0 0 0 0 0 0 0 0 O 0VMRFNTIOPLOFDFIFTFSFZFAFPF1CF其中系统标志:VM –虚拟8086 模式;RF –恢复标志;NT –嵌套任务标志;IO PL – I/O 特权级标志;IF –中断允许标志。
内存管理寄存器有4 个,用于分段内存管理:GDTR –全局描述符表寄存器(Global Descriptor Table Register);LDTR –局部描述符表寄存器(Local Descriptor Table Register);IDTR –中断描述符表寄存器(Interrupt Descriptor Table Register);TR –任务寄存器。
其中前两个寄存器(GDTR,LDTR)分别指向段描述符表GDT 和LDT。
IDTR 寄存器指向中断向量表。
TR 寄存器指向处理器所需的当前任务的信息。
80386 共有4 个控制寄存器,分别是CR0、CR1、CR2 和CR3。
格式见下图所示。
31 23 15 7 0页目录基地址寄存器Page Directory Base Register (PDBR)保留ReservedCR3附录465页异常线性地址Page Fault Linear AddressCR2保留ReservedCR1PG保留ReservedETTSEMMPPECR0控制寄存器CR0 含有系统整体的控制标志。
Intel 80x86系列CPU保护模式下最核心的部件中几个寄存器的作用这里我们主要介绍Intel 80x86系列CPU保护模式下最核心的部件中几个寄存器的作用,这些寄存器在Linux内核运行时起着至关重要的作用。
至于其他那些各式各样的硬件设备,我们在讲解设备驱动时会针对具体的驱动程序来介绍的。
首先,大家先看看CPU的主要架构:
EU(通用寄存器、运算器和控制器)执行部件:完成指令所要求的功能。
SU(段寄存器、段转换器)分段部件:完成执行单元的地址请求, 将虚地址转换为线性地址。
PU(TLB、页转换器)分页部件:将线性地址转换为物理地址。
BIU(总线接口)接口部件:完成指令预取请求和执行单元的数据存取请求,数据存取请求优先于指令预取请求。
IPU(控制逻辑和预取队列)预取部件:16字节指令预取队列, 提出预取请求。
IDU(指令译码、6字节指令队列)译码部件:完成指令译码功能。
FPU(片内集成了浮点协处理器):专用于浮点运算的处理部件。
下面,我们针对EU、SU和PU模块做做详细说明,其他模块就暂时不介绍了。
1 EU模块
EU模块是CPU中最核心,最重要的部件。
现在的奔腾CPU已经发展了若干年了,但其中最起作用的还是加法单元ALU,一组通用寄存器组、一个标志和控制逻辑。
如图:
首先,8个32位通用寄存器按使用情况分为三种:指针寄存器、变址寄存器、数据寄存器。
[1] 指针寄存器:主要提供全部或部分偏移量
ESP:专门存放堆栈段中栈顶单元的偏移量。
EBP:存放堆栈段中某个单元的全部/部分偏移量,也可存放32位或16位操作数或运算结果。
[2] 变址寄存器。