一段的定义
对于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个字节。它的每一项由对应的段选择符来确定。
阅读(937) | 评论(0) | 转发(0) |