汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-27 10:46] 段定义和虚拟地址到线性地址的转换

段是实现虚拟地址到线性地址转换机制的基础。 在保护模式下,每个段由三个参数进行定义:
段基地址(Base Address)
段界限(Limit)
段属性(Attribute)
    段基地址规定线性地址空间中段的开始地址。在保护模式下,段基地址长32位。因为基地址长度和寻址地址的产度相同, 所以任何一个段都可以从32位线性地址空间中的任何一个字节开始。
    段界限规定段的大小。 在保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字节为单位。 在段属性中有一位对此进行定义,把该位称为粒度位,用G标记。G=0表示段界限以字节为单位,于是20位的界限可表示的范围是1字节到1M字节,增量为1字节;G=1表示段界限以4K字节为单位,于是20位的界限可以表示的范围是4K字节到4G字节。增量为4K字节。当段界限以4K字节为单位时,实际的段界限Limit可以通过下面公式从20位段界限Limit计算出来:
LIMIT=Limit*4K+0FFFH
    所以,当粒度为1的时候,段的界限实际上就扩展成为32位。由此可见,保护模式下,段的长度可以大大超过64K字节。
    基地址和界限定义了段所映射的线性地址的范围。基地址Base是线性地址对应于段内偏移为0的虚拟地址,段内偏移为x的虚拟地址对应Base+x的线性地址,段内从偏移0到Limit范围内的虚拟地址对应从Base到Base+Limit范围内的线性地址。
    通过增加段界限,可以使段的容量得到扩展。 这对于那些要在内存中扩展容量的普通数据段很有效,但是对于堆栈段情况就不是这样。因为堆栈段底在高端,随着压栈操作,堆栈想低地址方向扩展。为了适应普通数据段和堆栈段在两个相反方向上的扩展,数据段的段属性中安排了一个扩展方向位,标记为ED。ED=0表示向高地址扩展,ED=1表示向低地址扩展。
    数据段的扩展方向和段界限一起决定了数据段内偏移的有效范围。当断大小为1M字节时,在向高地址方向扩展段内,0~Limit的偏移是合法有效的偏移,而从Limit+1~1M-1的偏移则是非法无效的偏移;在向低地址扩展段内,从0~Limit的偏移则是非法无效的偏移,而从Limit+1~1M-1的偏移则是合法有效的偏移。当段为4G时,情形类似。
    注意,只有在数据段的段属性中才有扩展方向位ED,亦即是说只有数段段(堆栈段作为特殊的数据段)才有向高扩展和向低扩展之分,其他段都是自然向高扩展。
    段属性规定段的主要特性。例如段粒度位G,还有扩展方向位ED等等。
评论次数(0)  |  浏览次数(712)  |  类型(汇编语言笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码