ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:39.50KB ,
资源ID:3766948      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3766948.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实模式和保护模式的区别.doc)为本站会员(11****ws)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

实模式和保护模式的区别.doc

1、实模式和保护模式的区别 实模式和保护模式的区别 2009-08-31 20:19 551 人阅读 评论(1) 收藏 举报 从 80386 开始,cpu 有三种工作方式:实模式,保护模式和虚拟 8086 模式。只有在刚刚启动的时候是 real-mode,等到 linux 操作系统运行起来以后就运行在保护模式(所以存在一个启动时的模式转换问题)。 实模式只能访问地址在 1M 以下的内存称为常规内存,我们把地址在 1M 以上的内存称为扩展内存。 在保护模式下,全部 32 条地址线有效,可寻址高达 4G 字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提

2、供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务切换和保护任务环境; 4 个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离; 支持虚拟 8086 方式,便于执行 8086 程序。1.虚拟 8086 模式是运行在保护模式中的实模式,为了在 32 位保护模式下执行纯 16 位程序。它不是一个真正的 CPU 模式,还属于保护模式。 2.保护模式同实模式的根本区别是进程内存受保护与否 。可寻址空间的区别只是这一原因的果。 实模式将整个物理内存看成分段的区域 ,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个

3、指针都是指向“实在“ 的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。 至此,进程(这时我们可以称程序为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有

4、: SIGSEGV(linux 段错误); 非法内存访问对话框(windows 对话框)。 CPU 启动环境为 16 位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式 3.事实上,现在的 64 位奔腾 4 处理器,拥有三种基本模式和一种扩展模式, a)基本模式: *保护模式:纯 32 位保护执行环境。 *实模式:纯 16 位无保护执行环境。 *系统管理模式:当 SMI 引脚为有效进入系统管理模式,首先保存当前的 CPU上下文。它有独立的地址空间,用来执行电源管理或系统安全方面的指令。 b)扩展模式:*IA-32e 模式,64 位操作系统运行在该模式。该模式有两种子模式: 1)*兼

5、容模式:该模式下, 64 位操作系统运行在 32 位兼容环境,能正常运行 16,32 位应用程序就像基本的保护模式一样,访问 32 位地址空间,但不能运行纯 16位实模式程序(就是不能运行虚拟 86 模式程序了)。 2)*64 位模式:在该模式下,处理器完全执行 64 位指令,使用 64 位地址空间和 64 操作数,运行 16,32 位程序必须切换到兼容模式。 IA-32e 子模式的切换完全基于代码段寄存器。这样一来,运行在 IA-32e 模式中(64位)的 OS 完全可以无缝的运行所有 16,32,64 为应用程序,通过设置 32 位后的 CS。2012-05-11 21:16:40| 分类

6、: 操作系统 LINUX | 标签: |字号大中小 订阅 第一:实模式下程序的运行回顾程序运行的实质是什么?其实很简单,就是指令的执行,显然 CPU 是指令得以执行的硬件保障,那么 CPU 如何知道指令在什么地方呢?80x86 系列是使用 CS 寄存器配合 IP 寄存器来通知 CPU 指令在内存中的位置。程序指令在执行过程中一般还需要有各种数据,80x86 系列有DS、ES、FS、GS、SS 等用于指示不同用途的数据段在内存中的位置。程序可能需要调用系统的服务子程序,80x86 系列使用中断机制来实现系统服务。总的来说,这些就是实模式下一个程序运行所需的主要内容(其它如跳转、返回、端口操作等相

7、对来说比较次要。)第二:保护模式-从程序运行说起无论实模式还是保护模式,根本的问题还是程序如何在其中运行。因此我们在学习保护模式时应该时刻围绕这个问题来思考。和实模式下一样,保护模式下程序运行的实质仍是“CPU 执行指令,操作相关数据”,因此实模式下的各种代码段、数据段、堆栈段、中断服务程序仍然存在,且功能、作用不变。那么保护模式下最大的变化是什么呢?答案可能因人而异,我的答案是“地址转换方式”变化最大。第三:地址转换方式比较先看一下实模式下的地址转换方式,假设我们在 ES 中存入 0x1000,DI 中存入 0xFFFF,那么 ES:DI=0x1000*0x10+0xFFFF=0x1FFFF

8、,这就是“左移 4 位加偏移”。那么如果在保护模式下呢?假设上面的数据不变 ES=0x1000,DI=0xFFFF,现在 ES:DI 等于什么呢?公式如下:(注:0x1000=1000000000000b= 10 0000 0000 0 00)ES:DI=全局描述符表中第 0x200 项描述符给出的段基址+0xFFFF现在比较一下,好象是不一样。再仔细看看,又好象没什么区别!为什么说没什么区别,因为我的想法是,既然 ES 中的内容都不是真正的段地址,凭什么实模式下称 ES 为“段寄存器”,而到了保护模式就说是“选择子”?其实它们都是一种映射,只是映射规则不同而已:在实模式下这个“地址转换方式”

9、是“左移 4 位”;在保护模式下是“查全局/局部描述表”。前者是系统定义的映射方式,后者是用户自定义的转换方式,而它影响的都是“shadow register”。从函数的观点来看,前者是表达式函数,后者是列举式函数:实模式: F(essegment)=segment |segment=es*0x10保护模式:F(essegment)=segment |(es,segment)GDT/LDT其中 GDT、LDT 分别表示全局描述符表和局部描述符表。第四:保护模式基本组成保护模式最基本的组成部分是围绕着“地址转换方式”的变化增设了相应的机构。1、数据段前面说过,实模式下的各种代码段、数据段、堆栈段

10、、中断服务程序仍然存在,我将它们统称为“数据段”,本文从此向下凡提到数据段都是使用这个定义。2、描述符保护模式下引入描述符来描述各种数据段,所有的描述符均为 8 个字节(0-7),由第 5 个字节说明描述符的类型,类型不同,描述符的结构也有所不同。若干个描述符集中在一起组成描述符表,而描述符表本身也是一种数据段,也使用描述符进行描述。从现在起,“地址转换”由描述符表来完成,从这个意义上说,描述符表是一张地址转换函数表。3、选择子选择子是一个 2 字节的数,其 16 位,最低 2 位表示 RPL,第 3 位表示查表是利用 GDT(全局描述符表)还是 LDT(局部描述符表)进行,最高 13 位给出

11、了所需的描述符在描述符表中的地址。(注:13 位正好足够寻址 8K 项)有了以上三个概念之后可以进一步工作了,现在程序的运行与实模式下完全一样!各段寄存器仍然给出一个“段值”,只是这个“假段值”到真正的段地址的转换不再是“左移 4 位”,而是利用描述符表来完成。但现在出现一个新的问题是:系统如何知道 GDT/LDT 在内存中的位置呢?为了解决这个问题,显然需要引入新的寄存器用于指示 GDT/LDT 在内存中的位置。在 80x86 系列中引入了两个新寄存器 GDR 和 LDR,其中 GDR 用于表示 GDT 在内存中的段地址和段限(就是表的大小),因此 GDR 是一个 48位的寄存器,其中 32

12、 位表示段地址,16 位表示段限(最大 64K,每个描述符 8 字节,故最多有 64K/8=8K 个描述符)。LDR 用于表示 LDT 在内存中的位置,但是因为 LDT 本身也是一种数据段,它必须有一个描述符,且该描述符必须放在 GDT 中,因此 LDR 使用了与 DS、ES、CS 等相同的机制,其中只存放一个“选择子”,通过查 GDT 表获得 LDT 的真正内存地址。对了,还有中断要考虑,在 80x86 系列中为中断服务提供中断/陷阱描述符,这些描述符构成中断描述符表(IDT),并引入一个 48 位的全地址寄存器存放 IDT 的内存地址。理论上 IDT 表同样可以有 8K 项,可是因为80x

13、86 只支持 256 个中断,因此 IDT 实际上最大只能有 256 项(2K 大小)。第五:新要求-任务篇前面介绍了保护模式的基本问题,也是核心问题,解决了上面的问题,程序就可以在保护模式下运行了。但众所周知 80286 以后在保护模式下实现了对多任务的硬件支持。我的第一反应是:为什么不在实模式下支持多任务,是不能还是不愿?思考之后,我的答案是:实模式下能实现多任务(也许我错了:)。因为多任务的关键是有了描述符,可以给出关于数据段的额外描述,如权限等,进而在这些附加信息的基础上进行相应的控制,而实模式下缺乏描述符,但假设我们规定各段的前 2 个字节或若干字节用于描述段的附加属性,我觉得和使用

14、描述符这样的机制没有本质区别,如果再附加其他机制.基于上述考虑,我更倾向于认为任务是独立于保护模式之外的功能。下面我们来分析一下任务。任务的实质是什么呢?很简单,就是程序嘛!所谓任务的切换其实就是程序的切换!现在问题明朗了。实模式下程序一个接一个运行,因此程序运行的“环境”不必保存;保护模式下可能一个程序在运行过程中被暂停,转而执行下一个程序,我们要做什么?很容易想到保存程序运行的环境就行了(想想游戏程序的保存进度功能),比如各寄存器的值等。显然这些“环境”数据构成了一类新的数据段(即 TSS)。延用前面的思路,给这类数据段设置描述符(TSS 描述符),将该类描述符放在 GDT 中(不能放在 LDT 中,因为 80x86 不允许:),最后再加一个 TR 寄存器用于查表。TR 是一个起“选择子”作用的寄存器,16位。好了,任务切换的基本工作就是将原任务的“环境”存入 TSS 数据段,更新TR 寄存器,系统将自动查 GDT 表获得并装载新任务的“环境”,然后转到新任务执行。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。