80386重要寄存器和数据结构
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简介(一)==============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

引脚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的特殊寄存器

状态和控制寄存器状态和控制寄存器是由标志寄存器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 和保护模式___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位简述 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保护模式工作原理

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保护模式工作原理

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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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和内存状态。