Chinaunix首页 | 论坛 | 博客
  • 博客访问: 528265
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类:

2012-04-13 19:29:39

一段的定义
           对于80x86提供了4GB的物理地址空间,这是处理器在其地址总线上可以寻址的地址空间,这个空间的地
址范围是0--0xFFFFFFFF。这个物理空间可以映射到读写内存、只读内以及内存映射I/O中。分段机制就是把虚拟地址(逻辑地址)空间的虚拟内存组织成一些长度可变的成为段的内存块单元。
           对于80386虚拟地址空间中的虚拟地址由一个段部分和一个偏移部分组成。段是虚拟地址线性地址转换机
制的基础 。每个段由三个参数定义:
    (1)段基地值:制定段在线性地址空间的开始地址,基地址为线性地址,对应与段中的偏移0处
    (2)段限长:是虚拟地址空间中段内的最大偏移地址。
    (3)段属性:指定段的属性。例如:读、写
对于保护模式寻址模式,上面的三个段存储于段描述符的结构体内。段描述符存储于内存中的段描述符表。
               段选择符                                                 偏移地址
                  |       |                                                       |
                  |       |                                                       |
                  |       |                                                       |
                  |--段描述符-----------------------------------  +
                                                                    31   线性地址  0

二、段描述符表
          两种:全局段描述符表(GDT)和局部描述符表(LDT)
          虚拟地址空间被分割成大小相等 的两份,一份由LDT映射局部虚拟地址空间、另一份由GDT映射全局虚拟
地址空间。
        当发生任务切换时, LDT发生改变,GDT并不发生改变。因此GDT映射的一般虚拟地址空间是系统中所有任务所共有的。但是LDT映射的是另一半则在任务切换时被改变。
              | -------------------------------------------------------                               
              |                            ---------------------------------|----------------------------------------|
              |                           |                                        |                                                  |
              |      DATAa          |                  GDT               |                                                  |
              |       CODEa        |                                        |                DATAb                       |
              |                            |         DATAos                  |                                                  |
              |      任务A             |          CODEos                 |                 任务B                       |
              |                            |                                        |                                                  |
              |-----------------------|--------------------------------|                                                 |
                                           |                                                          CODEb                     |
                                            |------------------------------------------------------------------------|
GDT:本身不是一个段,而是线性地址空间中的一个数据结构。GDT的基线性地址和长度值必读加载进GDTR寄
存器中,GDT的基址应该进行内存8字节对齐,以得到最佳处理器性能。此外:处理器并不使用GDT的第一个描
述符。把这个‘空描述符’的段选择符加载进艺术据段寄存器(DS、ES、FS、GS)并 不会产生一个异常。但是加载了‘空描述符’的段去访问内存就会产生保护异常。
             当使用SGDT指令保存GDTR寄存器内容是,一个48位‘伪描述符’被存储在内存中,为了在用户模式(特
级3)避免对其检查出错,为描述字符应该放在一个奇字地址处(6%4=2)。这会让处理器先放一个对齐字,随后是对齐双字。
三:段选择符(seletor)
段选择符是段的16位标识符。
15-3:索引值
3-2:表只是标志TI :
         TI = 0  :GDT 
         TI=1 :LDT
2-0请求特权值RPL
‘空描述符’:0000000000000 0 RPL
批注:为了减少地址转换时间和编程的复杂性,处理器提供最多可存放6个段选择符的寄存器,对于访问某个段的
程序,必须已经段选择加载到一个段寄存器中,因此尽管一个程序有多个段,但是同时可以立即访问的段只有6
个。另外,为了避免每次访问内存时都去引用描述符表,去读和解码一个段描述,每个寄存器都有一个‘可见’部分
和‘隐藏部分。当一个段选择符被加载到一个寄存器中时,处理器同时把段选择符指向的段描述中的段地址、段限
长、以及访问信息被加载到段寄存器的‘隐藏’部分。
四、段描述符:LDT、GDT中的数据结构项
           每个段描述符含有8个字节。它的每一项由对应的段选择符来确定。
      

阅读(944) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~