80386重要寄存器和数据结构

合集下载

80386微处理器_2014

80386微处理器_2014

例 请分析下面的描述符:
80 00 6 B2 0A 4 00 00 2 03 FF 0
解:属性字节:B2h = 10110010 数据段,可写,DPL=1,在内存,未访问过。
段基址:800A0000h 界限:003FFh
课堂练习3: 请分析下面的描述符:
30 00 6 D7 00 4 00 00 2 07 FF 0
解:LDTR = 0010000100001000 TI = 0, LDT描述符在GDT中 索引 = 0010000100001
LDT描述符的起始地址: GDT的基地址+索引×8
= 01002000h+0010000100001×8 = 01004108h
LDT描述符的地址范围(占8字节): 01004108h ~ 0100410Fh
00 00 6 A2 10 4 00 00 2 00 FF 0
解:属性字节:A2h = 1010001பைடு நூலகம் 386LDT描述符,有效,DPL=1。
LDT基址:00100000h 界限:000FFh
分段管理总结
4 (P297 9.21)
课 堂 练 习
: 图访
问 代 码 段
分页管理
在80386中,在设计分段管理的基础上又增加 了分页管理。在多任务系统中,有了分页管理功 能,就只需把每个活动任务当前所需要的少量页 面放在存储器中。
程序员编写程序时,其程序存入磁盘。这样, 从程序员的角度来看,系统中似乎有一个容量很大、 速度也相当快的虚拟存储器;其实,它并不是真正 物理上的内存。
3)保护机制;
特权保护机制、不同任务之间的隔离(不同的虚 拟存储空间)
(三)虚拟8086模式
(1)使80386可以快速地执行多个8086 的应用程序。 (2)段寄存器的用法和实模式时相同。 (3)存储器寻址空间为1MB,可以使用分页机制,支持多

80386简介1

80386简介1

80386简介(一)==============linux的早期版本,也是本课讲解的版本,是在80386上实现的,需要对该CPU先有个粗浅的了解。

重点是保护模式的几个概念。

注意:操作系统是管理硬件的程序,CPU的设计者与操作系统设计者的相互依赖是很强的。

80386是INTEL 1985年推出的CPU芯片,是80x86系列中第一个32位微处理器。

80386的内部和外部数据总线都是32位。

地址总线也是32位,可寻址高达4GB内存。

80386具有实模式、保护模式、虚86(V86)等三种工作方式。

系统加电时自动处于实模式,当操作系统初始化完成,操作系统可将其设为保护模式。

1实模式实模式是为了兼容于8086。

只使用20位地址总线,可寻址1M内存,物理地址=左移4位的段地址+偏移地址,等等,这些内容在“组成原理”中都过。

实模式寻址能力有限,而且不能为操作系统内核提供安全保护,比如它没有管态、目态。

没有为多道程序提供必要的支持,比如没有进程空间的隔离功能。

2保护模式可以使用32位地址总线,可寻址高达4GB内存(含虚存)。

但当时的386电脑一般只配1-8M内存,虚存也很小,有些硬盘本身的容量就不够4G。

保护模式和实模式都使用内存段、中断,但二者有很多不同。

在实模式中内存被划分成段,每个段的大小为64KB,这样段地址可以用16位表示。

有几个段寄存器(CS、DS、SS和ES),物理地址=左移4位的段地址+偏移地址。

而在保护模式下,段是通过一系列被称之为"描述符表"的表所定义的。

段寄存器存储的是指向这些表的指针,段长也不再固定为64位,而是可变的。

用于定义内存段的表有两种:全局描述符表(GDT)和局部描述符表(LDT)。

“描述符”是一个32位的地址指针。

GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。

每一个操作系统只定义一个GDT。

LDT也是段描述符的一个数组。

与GDT不同,LDT是一个段,每一个正在运行的进程都有一个自己的LDT。

5.现代微机结构_80386

5.现代微机结构_80386

引脚ERROR

1: 表示是80287, 或者无协处理器
通过执行指令来识别: 指令1 FNINIT 指令2 IN (控制寄存器)
区分有无协处理器 Di
R +5V
若读出的值为0, 则将1→MP, 0→ET 若读出的值为不为0, 则0→MP
(2) CR1: 未使用 (3) CR2: 页故障地址寄存器, 存放出现故障的页 的32位线性地址 (4) CR3: 页目录基地址寄存器, 存放页目录表的 基地址。
二级表的地址转换过程:
将虚拟地址的高20位分成两部分, 分别用于指示 两种不同表的表项(作为表内的偏移量)。 如下图所示:
31 22 21 12 11 0
线性地址 页目录偏移
页表偏移
页内偏移
D31~D22指示1024个目录项的一项, 该项的
内容为一个页表的基地址;
D21~D12指示1024个页表项的一项, 该项的内
2、分页管理
CR0中的PG位=0, 不允许分页, 经分段部件出来 的地址(即线性地址=物理地址);
如果PG=1, 则允许分页, 经分段部件出来的线性地 址仍为虚地址, 必须经分页部件转换成物理地址。
(1) 分页的寻址过程 从虚地址到实地址的转换过程 目标: 根据线性地址, 得到物理页面基地址以及 该页面内的偏移量 假设: 基于简单查表的转换机构, 用虚拟页号查表, 表中内容为实际页面的基地址 如下图所示:
SRAM
OE WE CS
D7~D0
SRAM BE0 BE1 BE2
OE WE CS
D15~D8
SRAM
OE WE CS
D23~D16
BE3
地址 地址 译码
SRAM

80386的特殊寄存器

80386的特殊寄存器

状态和控制寄存器状态和控制寄存器是由标志寄存器EFLAGS 、指令指针EIP 和4个控制寄存器组成,如图所示:1.指令指针寄存器和标志寄存器指令指针寄存器EIP 中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器CS 而言的。

偏移量加上当前代码段的基地址,就形成了下一条指令的地址。

EIP 中的低16位可以分开来进行访问,给它起名叫指令指针IP 寄存器,用于16位寻址。

标志寄存器EFLAGS 存放有关处理器的控制标志,如图所示。

标志寄存器中的第1、3、5、15位及18~31位都没有定义。

标志寄存器EFLAGS在这些标志位中,我们只介绍在Linux 内核代码中常用且重要的几个标志位:第8位TF (Trap Flag )是自陷标志,当将其置1时则可以进行单步执行。

当指令执行完后,就可能产生异常1的自陷(参看第四章)。

也就是说,在程序的执行过程中,每执行完一条指令,都要由异常1处理程序 (在Linux 内核中叫做debug())进行检验。

当将第8位清0后,且将断点地址装入调试寄存器DR0~DR3时,才会产生异常1的自陷。

第12、13位IOPL 是输入输出特权级位,这是保护模式下要使用的两个标志位。

由于输入输出特权级标志共两位,它的取值范围只可能是0、1、2和3共4个值,恰好与输入输出特权级0~3级相对应。

但Linux内核只使用了两个级别,即0和3级,0表示内核级,3表示用户级。

在当前任务的特权级CPL(Current Privilege Level)高于或等于输入输出特权级时,就可以执行像IN、OUT、INS、OUTS、STI、CLI和LOCK等指令而不会产生异常13(即保护异常)。

在当前任务特权级CPL为0时,POPF(从栈中弹出至标志位)指令和中断返回指令IRET可以改变IOPL字段的值。

第9位IF(Interrupt Flag)是中断标志位,是用来表示允许或者禁止外部中断(参看第四章)。

80386 和 保护模式

80386 和 保护模式

80386 和保护模式___William LiuIntel CPU 一般可以运行在两种模式之下,即实模式和保护模式。

早期的 Intel CPU ( 8086 , 8088 )只能工作在实模式之下,系统中只能运行单个任务,而且只能使用实地址模式。

对于 Intel 80386 以上的芯片则还可以运行在 32 位的保护模式之下。

在保护模式之下的 CPU 可以支持多任务;支持 4GB 的物理内存;支持 64TB 的虚拟内存;支持内存的页式管理和段式管理以及支持特权级。

本文档将首先介绍 Intel 80386 CPU 的几个内部寄存器,然后再由浅入深的分别介绍保护模式下的段式管理,页式管理,虚拟内存,多任务以及特权级管理等几个方面。

Intel 80386 CPU 的内部寄存器这一部分先大致介绍一下 386 的内部寄存器,具体细节在后面的几节中再详细说明。

一般来说, CPU 设计用来系统编程的系统寄存器包括如下几类:•标志寄存器 (EFLAGS)•内存管理寄存器 (GDTR , LDTR , IDTR , TR)•控制寄存器 (CR0 , CR1 , CR2 , CR3 , CR4)•兼容 8086 通用寄存器( EAX , EBX , ECX , EDX )•兼容 8086 段寄存器( CS , DS , ES , SS , FS , GS )•兼容 8086 数据寄存器( ESI , EDI , EIP , ESP )下面分别加以介绍:1) 标志寄存器 EFLAGS :跟 8086/8088 的 FLAGS 大致差不多。

只不过位宽由 16bit 变成了 32bit ,负责的状态标志也多了一些。

见图一所示:图一: EFLAGS 的结构其中系统标志: VM -虚拟 8086 模式; RF -恢复标志; NT -任务嵌套标志;IOPL - I/O 特权级标志; IF -中断允许标志。

2) 内存管理寄存器:一共有 4 个,用于分段内存管理,都是用于存放指针的,只是所指的再内存单元中的内容有所不同。

汇编学习笔记(15)-80386从16位32位

汇编学习笔记(15)-80386从16位32位

汇编学习笔记(15)-80386从16位32位简述 80386相⽐于8086 地址线从20位扩展为32位,这意味着80386可以最多访问4G的内存,同时所有的寄存器都扩展为32位寄存器,80386扩展了原来的寄存器,增加了⼀些新的指令,并增加了新的寄存器 80386的寄存器主要分如下⼏类:通⽤寄存器,段寄存器,指令寄存器,标志位寄存器,系统地址寄存器,控制寄存器,测试寄存器,调试寄存器。

80386的指令集也⼤多集成8086的指令集,只是将其扩充为32位寄存器⽽已。

寄存器通⽤寄存器通⽤寄存器是在8086的8个通⽤寄存器(AX,BX,CX,DX,BP,SP,SI,DI)的基础上将其扩展了32位寄存器,名称为在原先的名字前⾯加了个E,分别为EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI原先的16位和8位寄存器即 AX, AL ,AH等都还是可以使⽤的,同时AX 是EAX的低16位,类似于 AX和AL的关系,EAX的⾼16位⽆法单独使⽤。

段寄存器原先的段寄存器保持不变还是16位,同时增加了FS 和 GS两个新的段寄存器(这两寄存器的全称是啥没查到)指针寄存器扩展为32位,改名为EIP,IP仍然有效,是EIP的低16位标记寄存器标志寄存器也扩展为32位,并层架如下四个标志位 IO 特权(IOPL): 当执⾏IO指令的时候需要IO的特权级⼩于等于此标志位,占2位 嵌套任务标志(NT): ⽤来指⽰中断返回指令 IRET的⼯作⽅式 重启标志(RF): 与故障和调试有关 虚拟8086标志(VM): 表⽰当前⼯作在虚拟8086模式下控制寄存器R0:PG: 分页控制 PG=1: 启⽤内存的分页管理模式 PG=0: 禁⽤内存的分页管理模式PE: 分段控制 PE=1: 启⽤内存的分段管理模式, 同时进⼊保护模式 PE=0: 禁⽤内存的分段管理模式, 同时进⼊实模式MP: 算数存在位EM: 模拟位EM=0: 硬件执⾏浮点指令运算EM=1: 软件模拟浮点执⾏运算TS: 任务切换位ET: 扩展位R1: 保留未使⽤R2: 缺页中断时存储缺的页的地址R3: 页⽬录的地址,只能⽤前20位,后20位必须为0,所以是4K对齐的系统地址寄存器先简单介绍⼀下,在下⼀章会详细介绍他们GDTR: 全局表描述符表寄存器 48位,存放全局段描述符表的地址,前32位存放基地址,后16位是表界限,单位1字节。

80386保护模式工作原理

80386保护模式工作原理

DPL
TYPE
描述符表


描述符可用于描述多种对象:存储段、任务状态 段、调用门、任务门、中断门、陷阱门和LDT。 为了便于组织管理,80386把描述符组织成线性表。 由描述符组成的线性表称为描述符表。 每个描述符表本身形成一个特殊的内存数据段。 这样的特殊数据段最多包含8192个描述符。该段 由操作系统维护、并由处理器中的存储管理单元 硬件(MMU)访问。 在80386中有三种类型的描述符表:全局描述符表 GDT、局部描述符表LDT 和 中断描述符表IDT。 在整个系统中,全局描述符表GDT和中断描述符 表IDT只有一张,局部描述符表可以有若干张,每 个任务有一张。
两级页表结构
表项格式




P位表示该表项是否有效。P=1表项有效;P=0表项无效。 在通过页目录表和页表进行地址转换过程中,无论在页目 录表还是在页表中遇到无效表项,都会引起缺页异常。 处理器在访问过某个表项之后总是将其A位置1。一般由操 作系统将其周期性的刷新为0。 处理器在对某个物理页进行过写操作之后,总是将其所对 应的页表中表项的D位置1。 U/S和R/W位用于对页进行保护。
对输入/输出的保护





80386采用I/O特权级IPOL和I/O许可位图的方法来控制输入 /输出,实现输入/输出保护。 IOPL存放在标志寄存器EFLAG中,它规定了可以执行所有 与I/O相关的指令和访问I/O空间中所有地址的最低特权级。 只有当CPL <=IOPL时,才被允许随意访问I/O空间中的任 何地址。 每个任务都有一个I/O许可位图,它由二进制位串组成。位 串中的每一位依次对应一个I/O地址。 I/O许可位图存放在 每个任务所对应的任务状态段(TSS)中。 当CPL > IOPL时,如果该指令所访问的I/O地址所对应的当 前任务的I/O许可位为0,则80386允许该I/O操作,如果I/O 许可位为1,则禁止该I/O操作。 IOPL的设置和I/O许可位图的创建只能由操作系统进行。

80386保护模式工作原理

80386保护模式工作原理

DPL
TYPE
描述符表


描述符可用于描述多种对象:存储段、任务状态 段、调用门、任务门、中断门、陷阱门和LDT。 为了便于组织管理,80386把描述符组织成线性表。 由描述符组成的线性表称为描述符表。 每个描述符表本身形成一个特殊的内存数据段。 这样的特殊数据段最多包含8192个描述符。该段 由操作系统维护、并由处理器中的存储管理单元 硬件(MMU)访问。 在80386中有三种类型的描述符表:全局描述符表 GDT、局部描述符表LDT 和 中断描述符表IDT。 在整个系统中,全局描述符表GDT和中断描述符 表IDT只有一张,局部描述符表可以有若干张,每 个任务有一张。
GDT和LDT

GDT含有每一个任务都可能访问的描述符,通常包含操作 系统所使用的代码段、数据段和堆栈段的描述符,也包含 多种特殊描述符,如LDT描述符。在任务切换时,并不切 换GDT。通过GDT可以使各任务都需要的段能够被共享。

每个任务的局部描述符表LDT含有该任务自己的代码段、 数据段和堆栈段的描述符,也包含该任务所使用的一些门 描述符,如任务门和调用门描述符等。随着任务的切换, 系统当前的局部描述符表LDT也随之切换。通过LDT可以 使各个任务私有的各个段与其它任务相隔离,从而达到受 保护的目的。
两级页表结构



页映射表的第一级称为页目录表,存储在一个4K字节的物 理页中。页目录表共有1K个表项,其中,每个表项为4字 节长,包含对应第二级表所在物理地址空间页的基地址。 页映射表的第二级称为页表,每张页表也安排在一个4K字 节的页中。每张页表都有1K个表项,每个表项为4字节长, 包含对应物理地址空间页的基地址。 由于页目录表和页表均由1K个表项组成,所以使用10位的 索引就能指定具体表项,即用10位的索引值乘以4加基地址 就得到了某个表项的物理地址。 任务切换时,页目录表和页表也要相应进行切换,使得不 同任务的线性地址空间被映射到不同的物理地址空间中。 当前页目录表的物理基地址存放在CR3寄存器中。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

80386重要寄存器和数据结构
描述符(Descriptor)
具有固定长度的结构体(struct),共8个字节。

这个结构体保存着一个段基地址的所有信息,包含:
1.段基地址
2.段长度
3.段属性
描述符有两种,这两种结构体包含的内容几乎都一样,只有一些细小的差别,这两种描述符分别是:
1.非系统描述符:用来描述数据段,代码段和堆栈段的结构;
2.系统段描述符:用来描述LDT和TSS的,(LDT和TSS在后面有说明)。

全局描述符表(GDT: Global Descripter Table)
顾名思义,它是一个表结构。

这个表存储在内存中,相当于C语言中的一个结构体数组。

数组的每一项就是上面所说的描述符。

GDT在一个多任务系统中一般只设置一个,其基址由一个GDTR确定(GDT靠GDTR定位),GDT地址在设置好之后几乎不会被改变。

这个表中可以包含如下四种信息的描述符:
1.全局数据段,代码段和堆栈段信息。

这些段一般由操作系统内核使用。

2.对LDT的描述,这个描述符的基址就是是LDT所在内存中的起始地址
3.对TSS的描述,这个描述符的基址是TSS所在内存中的起始地址
4.一些门描述符(调用门,中断门等…)。

其中#1属于非系统段描述符,#2 #3 #4属于系统段描述符。

描述符各自
的属性值决定了它们具体是哪类描述符。

其中,LDT,TSS属于具体每个
任务,一般成对出现在GDT中。

全局描述符表寄存器(GDTR:Global Descripter Table Register)
GDTR是一个CPU寄存器,和AX BX.. CS DS...一个概念。

GDTR共48位,包含两部分内容:
1.开头32位用来保存一个内存地址,指出GDT在内存中的位置(如果没有
开启分页,它就是一个32位的物理地址);
2.随后16位为GDT的长度信息,即GDT共有有多少项。

局部描述符表(LDT:Local Descripter Table)
与GDT的结构类似,所不同的是,LDT用来描述每个具体用户任务代码段,堆栈段和数据段信息。

LTD是针对每个用户任务的,类似TSS这样的全局信息相关的描述项自然只存在GDT中,LDT中不会有。

LDT描述项一般和正在运行的用户任务数相等。

每个用户任务都可能有自己的LDT,保存着本任务相关信息。

LDT的基址作为一条记录保存在GDT中(参见上面GDT#2)。

局部描述符表寄存器(LDTR:Global Descripter Table Register)
LDTR也是一个寄存器,和GDTR类似,不同的是它只有16位。

LDTR中存放的是一个16位选择子,寻址时用选择子内容去GDT中定位寻找LDT的基址。

LDTR当作为选择子,任务切换时只要改变其中存放的选择子内容就能实现LDT的切换。

任务寄存器(TR:Task Register)
也是一个16为的选择子,作用和LDTR类似,都是用来索引全局描述符表(GDT)中的一项。

所不同的是TR选择和指向的是一个任务状态段地址(TSS:Task Status Segment)。

任务状态段(TSS:Task State Segment)
正如前文所说,任务状态段(TSS)信息是在GDT中描述的。

任务状态段也是是内存中的一个数据结构。

这个结构中保存着和任务相关的信息。

当运行着的任务准备切换时,CPU会把当前任务用到的寄存器内容(CS EIP DS SS...)包括LDT 的选择子等信息保存在TSS中以便任务切换回来时候继续使用。

选择子(Selector)
选择子按照用途共有三种,其格式完全一样,仅仅用途不同。

1.TR中的选择子,指向GDT中一个TSS的描述项。

2.LDTR中的选择子,指向GDT中一个LDT的描述项。

3.用户程序中的逻辑地址组成部分(这个地址即虚拟地址48位=16位选择
子+32位偏移地址)。

它用来选择程序用到的数据段,代码段等在LDT中
的描述项。

此处的选择子由编译,连接或者操作系统决定的。

80386中除了上述寄存器以外,还有一些用户程序不可访问的高速缓冲寄存器寄存器,为的是提高CPU计算性能。

分页机制
控制寄存器(Control Registor)CR3中保存着一个页基址A,如果分页被启用,线性地址经需要经过两级页变换成最终的物理地址:具体过程见下图.
分页机制
参见上图,线性地址从高到底被分成三个部分高10位B,中间10位C,末12位D。

变换过程不再描述,语言描述可能看上去复杂,图表相对清晰,这里结合上图给出一个变换过程公式,结合上图应该可以比较清楚的看出分页机制。

页基址 = A;
页基址 = 页基址 + B * 4; /* 查一级目录页表,在(页基址+B*4)处取得二级页表的的基址,这里等号代表查表 */
页基址 = 页基址 + C * 4; /* 查二级目录页表,在(页基址+B*4)处取得物理基址,这里等号代表查表 */
物理地址 = 物理基址 + D;
上述公式中B和C为什么要乘以4?因为页表按4位对齐的。

页目录项后四位不用。

类似的,GDT/LDT中一项长度为8字节,选择子去GDT/LDT中索引如下:
描述符地址 = Base + Selector * 8.
80386内存管理和任务切换过程
一个80386操作系统中运行两个用户任务A和B,如图:
任务A运行时CPU和内存状态如下
任务A运行时CPU和内存状态
切换到任务B运行时,CPU和内存状态如下
切换到任务B运行时CPU和内存状态。

相关文档
最新文档