保护模式下寻址.pdfVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
保护模式下寻址.pdf

[ 内存寻址] 实模式下的内存寻址: 让我们首先来回顾实模式下的寻址方式 段首地址×16 +偏移量 = 物理地址 为什么要×16 ?因为在8086CPU中,地址线是20位,但寄存器是16位的,最高寻址64KB,它无法寻址到 1M内存。于是,Intel设计了这种寻址方式,先缩小4位成16位放入到段寄存器,用到时候,再将其扩大到 20位,这也造成了段的首地址必须是16 的倍数的限制。 保护模式下分段机制的内存寻址: 保护模式下 分段机制是利用一个称作段选择符的偏移量,从而到描述符表找到需要的段描述符,而 这个段描述符中就存放着真正的段的物理首地址,再加上偏移量 一段话,出现了三个新名词: 1、段选择子 2 、描述符表 3、段描述符 我们现在可以这样来理解这段话: 有一个结构体类型,它有三个成员变量:段物理首地址 段界限 段属性 内存中,维护一个该结构体类型的是一个数组。而分段机制就是利用一个索引,找到该数组对应的结构 体,从而得到段的物理首地址,然后加上偏移量,得到真正的物理地址。 公式:xxxx :yyyyyyyy 其中,xxxx也就是索引,yyyyyyyy是偏移量 (因为32位寄存器,所以8个16进制)xxxx存放在段寄存器中。 现在,我们来到过来分析一下那三个新名词。段描述符,一个结构体,它有三个成员变量:1、段物理首地 址 2 、段界限 3、段属性 我们再来重温一遍 描述符表,也就是一个数组,什么样的数组呢?是一个段描述符组成的数组。 接下来看看段选择子:段选择子,也就是数组的索引,但这时候的索引不在是高级语言中数组的下 标,而是我们将要找的那个段描述符相对于数组首地址 (也就是全局描述表的首地址)偏移位置。 就这么简单,如图: 图中,通过Selector (段选择子)找到存储在Descriptor Table (描述符表)中某个Descriptor (段描述 符),该段描述符中存放有该段的物理首地址,所以就可以找到内存中真正的物理段首地址Segment Offset (偏移量):就是相对该段的偏移量 物理首地址 + 偏移量 就得到了物理地址 本图就是DATA 但这时,心细的朋友就发现了一个GDTR这个家伙还没有提到! 我们来看一下什么是GDTR ? Global Descriptor Table Register (全局描述符表寄存器)但是这个寄存器 有什么用呢 ? 大家想一下,段描述符表现在是存放在内存中,那CPU是如何知道它在哪里呢?所以,Intel 公司设计了一个全局描述符表寄存器,专门用来存放段描述符表的首地址,以便找到内存中段描述符表。 这时,段描述符表地址被存到GDTR寄存器中了。 好了,分析就到这,我们来看一下正式的定义: 当x86 CPU 工作在保护模式时,可以使用全部32根地址线访问4GB的内存,因为80386 的所有通用寄存器 都是32位的,所以用任何一个通用寄存器来间接寻址,不用分段就可以访问4G空间中任意的内存地 址。也就是说我们直接可以用Eip寄存器就可以找到茫茫内存里面所有的值! 但这并不意味着,此时段寄存 器就不再有用了[其实 还有部分原因是要与8086兼容] 。实际上,段寄存器更加有用了,虽然再寻址上没有 分段的限制了,但在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是 不是允许执行等等涉及保护的问题就出来了。[想想吧,单单就是靠eip找到所有内存的值显然不够的, 醒醒吧,我们到了80386时代了,我们需要保护模式,要指示出来那些内存段是操作系统核心用的,那些是 你打游戏时用的,打游戏时的cpu不能访问到操作系统核心所用的内存段。我们需要分出级别来] 。 要解 决这些问题,必须对一个地址空间定义一些安全上的属性。段寄存器这时就派上了用场。但是设计属性和 保护模式下段的参数,要表示的信息太多了,要用64位长的数据才能表示。我们把着64位的属性数据叫做 段描述符,上面说过,它包含3个变量: 段物理首地址、段界限、段属性 80386 的段寄存器是16位 (注意:通用寄存器在保护模式下都是32位, 但段寄存器没有被改变,比如cs还是16位的,16位的段寄存器怎么可能装下一个64位的段描述符) 的,无法放下保护模式下64位的段描述符。如何解决这个问题呢? 方法是把所有段的段描述符顺序存放 在内存中的指定位置,组成一个段描述符表 (Descriptor Table );而段寄存器中的16位用来做索引 信息,这时,段寄存器中的信息不再是段地址了,而是段选择子 (Se le ctor )。可以通过它在段描 述符表中“选择”一个项目已得到

文档评论(0)

zhangchao11 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档