8038632位段式寻址方式..docxVIP

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

80386 32位段式寻址方式 80386是个32位CPU,也就是说它的ALU数据总线是32位的。我们在前面说过,最自然的地址总线宽度是与数据线一致。当地址总线宽度达到32位时,其寻址能力达到了4G(4千兆),对于内存来说似乎是足够了。所以,如果新设计一个32位CPU的话,其结构应该是可以做到很简洁、很自然的。但是,80386却无法做到这一点。作为一个产品系列中的一员,80386必须维持那些段寄存器,还必须支持实地址模式,在此同时又要能支持保护模式。而保护模式是完全另搞一套,还是建立在段寄存器的基础上以保持风格上的一致,而且还能节约CPU内部的资源呢?这对于Intel的设计人员无疑又是一次挑战。Intel选择了在段寄存器的基础上构筑保护模式的构思,并且保留段寄存器为16位(这样可以利用原有的四个段寄存器),但是却又添加了两个段寄存器FS和GS。为了实现保护模式,光是用段寄存器来确定一个基地址是不够的,至少还得要有一个地址段的长度,并且还需要一些其他的信息,如访问权限之类。所以,这里需要的是一个数据结构,而并非一个单纯的基地址。对此,Intel设计人员的基本思路是:在保护模式下改变段寄存器的功能,使其从一个单纯的基地址(变相的基地址)变成指向这样一个数据结构的指针。这样,当一条内存指令发出一个内存地址时,CPU就可以这样来归纳出实际上应该放上数据总线的地址:1. 根据指令的性质来确定应该使用哪一个段寄存器,例如转移指令中的地址在代码段,而取数据指令中的地址在数据段。这一点与实地址模式相同。2. 根据段寄存器的内容,找到相应的“地址段描述结构”。3. 从地址段描述结构中得到基地址。4. 将指令发出的地址作为位移,与段描述结构中规定的段长度相比,看看是否越界。5. 根据指令的性质和段描述符中的访问权限来确定是否越权。6. 将指令中发出的地址作为位移,与基地址相加而得出实际的“物理地址”。虽然段描述结构存储在内存中,在实际使用时却将其装载入CPU中的一组“影子”结构,而CPU在运行时则使用其在CPU中的“影子”。从“保护”的角度考虑,在由(指令给出的)内部地址(或者说“逻辑地址”)转换成物理地址的过程中,必须要在某个环节上对访问权限进行比对,以防止不具备特权的用户程序通过玩弄某些诡计(例如修改段寄存器的内容,修改段描述符的内容等),得以非法访问其他进程的空间或系统空间。明白了这个思路,80386的段式内存管理机制就比较容易理解了(还是很复杂)。下面就是此机制的实际实现。首先,在80386 CPU中增设了两个寄存器:一个是全局性的段描述表寄存器GDTR(global descriptor table register),另一个是局部性的段描述表寄存器LDTR(local descriptor table register),分别可以用来指向存储在内存中的一个段描述结构数组,或者称为段描述表。由于这两个寄存器是新增设的,不存在与原有的指令是否兼容的问题,访问这两个寄存器的专用指令便设计成“特权指令”。在此基础上,段寄存器的高13位(低3位另作他用)用作访问段描述表中具体描述结构的下标(index),如图下图所示:GDTR或LDTR中的段描述表指针和段寄存器中给出的下标结合在一起,才决定了具体的段描述表项在内存中的什么地方,也可以理解成,将段寄存器内容的低3位屏蔽掉以后与GDTR和LDTR中的基地址相加得到描述表项的起始地址。因此就无法通过修改描述表项的内容来玩弄诡计,从而起到保护的作用。每个段描述表项的大小是8个字节,每个描述表项含有段的基地址和段的大小,再加上其他一些信息,其结构下图所示:结构中的B31~B24和B23~B16分别是基地址的bit24~bit31和bit16~bit23。而L19~L16和L15~L0则为长度(limit)的bit16~bit19和bit0~bit15。其中DPL是个2位的位段,而type是一个4位的位段。它们所在的整个字节分解下图所示。上面有一个标志位没有提到是G:解释如下:G:颗粒度(Granularity):指定了限长字段值代表的单元含义。当为0 时,限长单元值为1 字节;当该位为1 时,限长的单元值为4KB 字节。我们也可以用一段“伪代码”来说明整个段描述结构:typedef struct {unsigned int base24_31:8; /* 基地址的最高8位 */unsigned int g:1; /* granularity,表段的长度单位,0表示字节,1表示4KB */unsigned int d_b:1; /* default operation size,存取方式,0=16位,1=32位 */unsigned int unused:1; /* 固定设置为0 */unsigned

文档评论(0)

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

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

1亿VIP精品文档

相关文档