x86保护模式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

19
地址转换及保护图
20
2、实模式和保护模式
• 实地址模式 • 保护模式
– 寻址范围1MB(220),始用于16位的8086和8088 – 用CS、DS、SS、ES解决数据地址总线与ALU宽度不一致问题 – 有分段雏形,但不具备段的范围限长和特权级别等保护机制
– 始于286,完善于386。继承了实模式下的16位段寄存器 – 直接寻址范围4GB(232), 虚拟存储空间可达64TB( 246=213*232*2,13是段寄存器的索引号位数,另外段寄存器中的TI 标志还可以区分GDT和LDT) – 提供了实现分段和分页的虚拟存储的硬件机制 – 是操作系统实现多进程存储管理以及提供存储保护的硬件基础
24
4、物理地址、虚拟地址及线性地址
将主板上的物理内存条所提供的内存空间定义为物理内存空间, 其中每个内存单元的实际地址就是物理地址 将应用程序员看到的内存空间定义为虚拟地址空间(或地址空间), 其中的地址就叫虚拟地址(或虚地址),分段机制下,一般用“段: 偏移量”的形式来描述 线性地址空间是指一段连续的,不分段的,范围为0到n的地址空 间,一个线性地址就是线性地址空间的一个绝对地址。
22
①通用寄存器 8个32位通用寄存器:EAX ,EBX ,ECX ,EDX ,EBP , ESP, ESI及 EDI。支持1、8、16、32位计算及16、32内存寻址 16位操作时,低部分做8个16位寄存器:AX, BX …DI 8位操作时, EAX ,EBX ,ECX ,EDX低16位被分为8位一组 的高低两部分,做8个8位寄存器。AH,AL,BH,BL… ②段寄存器 4个16位的段寄存器:CS、DS、SS、ES 16位寻址时,分别用于存放可执行代码的代码段、数据段、堆 栈段和其他段的基地址。 32位寻址时,段寄存器中存放的不再是某个段的基地址,而是 某个段的选择符(Selector) 。段基地址存放在内存的段描述 符表(Descriptor )中,选择符即表索引

20位 地址线
低4位
FFFFF
1、16位的寄存器如何进行20位的地址计算?
16位寄存器(放基地址a)
指令中16位逻辑地址b:12 +4
形成20位的内存地址
寄存器中的基地址a与指令中的逻辑地址b均是16位,但通过 移位处理,可计算得20位物理内存地址
9
2、指令中的逻辑地址
寻址中处理的逻辑地址是16位,即>64K的程序是无法编址 在一段的,所以程序需被编译成若干段,每段不大于64K。逻辑地 址为:段地址+偏移量,每段内偏移量都可从0开始
32位 地址线
内存 FFFF FFFF
过程描述
1. 2. 判断指令类型,确定使用哪个段寄存器 读段寄存器的内容,找到存放段描述信息的数据结构。(GDTR、 LDTR) ① 通过TI标志,判断本次操作所用段是到全局段描述表中找,还 是到局部段描述表中找 ② 读GDTR或LDTR寄存器中存放的地址,找到描述表的首地址 ③ 根据段寄存器中记录的索引号从描述表首址处偏移,找到第n个 描述符,既是要找的段信息。 得到基地址 指令地址做偏移,判断是否长度越界 根据指令性质及段描述符中的访问权限判断是否越权 将基地址与指令中的偏移地址相加得到实际的内存地址,完成地址 映射。
18
保护的表现 • 界限保护
• 权限保护
越界判断:段长参数 特权指令:新增的GDTR或LDTR寄存器不存在与旧指令兼容问 题,访问他们的指令设定为特权指令,段寄存器的访问属性仍 然同以往一样无特权,既保持了兼容,又保证了程序无法故意 修改段描述进行越界。 根据段的保护属性判断是否具有访问权限。如,只读段中不允 许写入。 系统态、用户态分离。段寄存器中的后两位RPL表示请求者操 作要求的特权级。GDTR或LDTR中的dpl字段设定了段的访问 权限。指令段rpl标志要求的权限应不低于dpl规定的级别。特 权指令只能在系统态执行。
12
32位时代——80386
• 保护模式: – 系统态和用户态分离,设定特权指令 • 关于寻址: – 32位数据总线;32位地址线的内存寻址也足够用(4G) – 总线宽度一致,是否还分段?是否还要段寄存器? 要向下兼容,支持16位处理器的实模式分段,所以仍需保留分 段模式,保留段寄存器 • 仍用分段机制,实现32位保护模式并支持16位实模式。如何实现 呢???
增设4个16位 段寄存器:CS、 DS、SS、ES
给定一个基地址,进程地址总 能访问从此开始的64KB(216) 连续地址空间
CodeS: 如04F3 DataS StackS
00000
04F30
0000 0001 300F … FFFF 源程序
16位 ES 高12位
累加
高16位
内存 1M
0 7 F 320=24*216=16* 216 • 启发: 基地址 + 16位偏移
0 0000 0 0001 … 0 FFFF 1 0000 1 0001 … 1 FFFF … … F 0000 F 0001 … F FFFF
地址一般都是按字节编址
7
16位逻辑地址300F的 内存寻址过程示意

• • •
• •
3
n位处理器,一般指ALU宽度。
• 8位:8080 • 16位:8086、8088、80286 • 32位:80386 – i386系列开始 • 内存寻址亦随着处理器变化而变化: – 16位、24位、32位
4
1、内存寻址的演变 8位时代——8080
• • • 系统总线的数据线通常与ALU同宽度 从程序设计的角度,地址最好与一个整数的长度一致。 8位数据线、8位地址线? • NO! 8位数据线、16位地址线? • 因为8位的cpu寻址能力,仅寻址256B (28)内存太小了。所以地 址线采用16位寻址 (216B=64KB) ,于是也造成了cpu内部结构 的不均匀性。 8位寄存器如何寻址16位地址? 8080利用1个8位主累加器和若干8位次累加器(寄存器)的计算实现 16位内存地址访问。 – 此时的内存访问是绝对地址访问,程序中的地址就是实际物理地址 (程序直接操作寄存器、内存单元等,与硬件相关)。 – 没有段的概念。
13
• 16位实模式
– 段寄存器存放16位的段基址。 – 控制寄存器CR0的第0位是一个保护允许标志位PE,若为0,则 处理器在实模式下运行。 – 32位指令指针寄存器EIP的低16位作为IP寄存器,存放偏移量, 与CS中的段基址加和得到下一条指令地址。
14
32位保护模式
• 16位段寄存器存放不了32位的基地址。 – 另外,为了实现保护,除了段的基地址,还需要更多其他信息: 段长、访问权限等。即需要一个数据结构。 16位段寄存器功能变化:存放基地址所在数据结构的地址指针,而 不是存段的基地址。
问题:修改段寄存器的指令不是特权指令


若用户程序修改了段寄存器里的内容,可以访问内存任何地 址不受限制。 缺乏访问限制,其他安全管理更无从谈起
此时的分段,缺乏对内存空间的保护。为区别后来的保护模 式,称为“实地址模式”。
11
过渡——80286
• 16位处理器24位内存寻址。 • 不直接从段寄存器中获得段的起始地址,而需要经过额外转换和检 查 。保护模式开始出现。 缺陷: • 系统启动时处理器处于实模式访问1M空间,经过处理可进入保护 模式,访问到16M空间,但是无法从保护模式返回到实模式 • 每个段大小不超过64k,程序规模受限制。

+首址
基地址 段界限
段描述符表
15
寻址过程
数据结构中某 一项的索引号
段选择符 CodeS DataS StackS ES
权限 判断
数据结构 的首地址
GDTR 或LDTR 越界 判断
段相关信息的 数据结构
0000 0000 段描述符表 (段表)
0000 0000
32位 FFFF FFFF ……
32位 基地址 累加
21
3、IA32处理器中的寄存器
80386以后直至奔腾系列,体系结构均无本质变化,80386以后的处 理器统称为IA32(32bit intel architecture) 支持32位处理器,同时要向下支持16位处理器,其内部寄存器相关 变化如后面所示: 想一想:前面的分段流程中,相关数据会存放在下面的哪个寄存器中。
23
③指令指针寄存器EIP 存放下一条将要执行指令的偏移量(offset ),偏移量加上 当前代码段的基地址,就形成了下一条指令的地址。 EIP中的低16位可以被单独访问,给它起名叫指令指针IP寄存 器,用于16位寻址。 ④标志寄存器 标志寄存器EFLAGS存放有关处理器的控制标志,很多标志与 16位FLAGS中的标志含义一样。 ⑤增加4个32位控制寄存器CR0-CR3,用于分页。通过标志位控制, 可选择是否分页,以及是实模式还是保护模式寻址。 ⑥增加4个系统地址寄存器,8个调式寄存器,2个测试寄存器。
• •
5
16位时代——8086、8088
• 8086处理器是intel x86王朝的开始,因为引入了重要概念——段。 段是怎么来的? – 8086ALU的宽度即数据总线是16位 – 内存地址线设置16位的话就一致了。 – 但16位大小的内存空间似乎满足不了未来需要。Intel最终决定 内存寻址目标为20位(1MB)。 – 位数不一致,相差4位!!!16位的寄存器如何进行20位的地 址计算?
X86内存寻址
保护模式
1
第一步理解
从启动开始,处理器就在不断的取指令、执行指令。 内存寻址是关系系统运行很重要的一个问题,先进行讨论: 处理器怎么从内存中找到一条指令? 当PC电源打开后,x86结构的CPU将自动进入实模式,并从地址0xFFFF0处 开始自动执行程序代码,无论是Award BIOS还是AMI BIOS,放在这里的 只是一条跳转指令,跳到系统BIOS中真正的启动代码处。这个地址通常是 ROM-BIOS中的地址。BIOS执行系统自检,并从物理地址0处开始初始化 中断向量,然后将512字节引导扇区读入到绝对地址0x7c00处并跳转到这 个地方执行。(与BIOS中设置的启动设备有关)
源程序 00 0000 0001 … FFFF 0000 0001 … FFFF 0000 0001 … FFFF
01

10
段式内存管理的好处
1. 程序员开始获得了自由。程序的地址不再需要硬编码了,调 试错误也更容易定位了 2. 更可贵的是支持更大的内存地址。16位地址只能定义64KB大 小的内存空间,而采用20位则增大了24倍可寻址内存,在当 时是很可观的。
2
内存寻址
处理器的发展
• 操作系统是以硬件为基础的,linux支持的处理器平台有ARM 、i386 、 Alpha等,目前几乎支持所有主流CPU Intel公司的i386是使用最广泛的,intel最早推出了微处理器史上第一款微处 理器芯片4004,4位处理器;随后又推出8位的8080处理器,而今已发展至 64位处理器 目前流行的Android智能终端,多采用ARM CPU,x86的CPU逐渐在增多。 同是RISC精简指令集,龙芯当初选择了购买mips授权,没有选择arm。 1990年11月27日,Acorn公司正式改组为ARM计算机公司。苹果公司出资 150万英镑,芯片厂商VLSI出资25万英镑,Acorn本身则以150万英镑的知识 产权和12名工程师入股。公司的办公地点非常简陋,就是一个谷仓。在业务 极其不景气 的时候,ARM做出了一个意义深远的决定:自己不制造芯片,只 将芯片的设计方案授权(licensing)给其他公司,由它们来生产。 ARM(Acorn RISC Machine) Intel的成功靠的是对市场 的理解,对用户习惯的高度重视和在兼容性上付出 的努力。
3. 4. 5. 6.
17
相关名词
段描述符表 段描述符:段描述符表中的一项,表示一段的信息: 段的基地址(Base Address):在线性地址空间中段的起始地址。 段的界限(Limit):即段大小,在虚拟地址空间中,段内可以使用 的最大偏移量。 段的保护属性(Attribute): 表示段的特性。例如,该段是否可被 读出或写入,或者该段是否作为一个程序来执行,以及段的特权 级等等。 段选择符(段寄存器 ) 包括:索引、TI、RPL 存放段描述符在段表中的索引号(段编号),TI标志用于说明是 是GDT还是LDT表,RPL标志权限。
相关文档
最新文档