[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 系统管理 > Linux > 正文
 

探索Linux 操作系统内存模型和管理 (2)

作者:Vikram Shukla 来源:Linux时代 (2007-02-07 15:18:13)

段控制单元模型概述

这种分段模型背后的基本思想是将内存分段管理。从本质上来说,每个段就是自己的地址空间。段由两个元素构成:

●基址 (base address) 包含某个物理内存位置的地址

●长度值 (length value) 指定该段的长度

分段地址还包括两个组件 —— 段选择器 (segment selector) 和段内偏移量 (offset into the segment)。段选择器指定了要使用的段(即基址和长度值),而段内偏移量组件则指定了实际内存位置相对于基址的偏移量。实际内存位置的物理地址就是这个基址值与偏移量之和。如果偏移量超过了段的长度,系统就会生成一个保护违例错误。

上述内容可小结如下:

分段单元可以表示成 -> 段: 偏移量 模型;

也也可表示成 -> 段标识符: 偏移量。

每个段都是一个 16 位的字段,称为段标识符 (segment identifier) 或段选择器 (segment selector)。x86 硬件包括几个可编程的寄存器,称为 段寄存器 (segment register),段选择器保存于其中。这些寄存器为 cs(代码段)、ds(数据段)和 ss(堆栈段)。每个段标识符都代表一个使用 64 位(8 个字节)的段描述符 (segment descriptor) 表示的段。这些段描述符可以存储在一个 GDT(全局描述符表,global descriptor table)中,也可以存储在一个 LDT(本地描述符表,local descriptor table)中。

图 2. 段描述符和段寄存器的相互关系

每次将段选择器加载到段寄存器中时,对应的段描述符都会从内存加载到相匹配的不可编程 CPU 寄存器中。每个段描述符长 8 个字节,表示内存中的一个段。这些都存储到 LDT 或 GDT 中。段描述符条目中包含一个指针和一个 20 位的值(Limit 字段),前者指向由 Base 字段表示的相关段中的第一个字节,后者表示内存中段的大小。

其他某些字段还包含一些特殊属性,例如优先级和段的类型(cs 或 ds)。段的类型是由一个 4 位的 Type 字段表示的。

由于我们使用了不可编程寄存器,因此在将逻辑地址转换成线性地址时不引用 GDT 或 LDT。这样可以加快内存地址的转换速度。

段选择器包含以下内容:

●一个 13 位的索引,用来标识 GDT 或 LDT 中包含的对应段描述符条目

●TI (Table Indicator) 标志指定段描述符是在 GDT 中还是在 LDT 中,如果该值是 0,段描述符就在 GDT 中;如果该值是 1,段描述符就在 LDT 中。

●RPL (request privilege level) 定义了在将对应的段选择器加载到段寄存器中时 CPU 的当前特权级别。

由于一个段描述符的大小是 8 个字节,因此它在 GDT 或 LDT 中的相对地址可以这样计算:段选择器的高 13 位乘以 8。例如,如果 GDT 存储在地址 0x00020000 处,而段选择器的 Index 域是 2,那么对应的段描述符的地址就等于 (2*8) + 0x00020000。GDT 中可以存储的段描述符的总数等于 (2^13 - 1),即 8191。

图 3. 从逻辑地址获得线性地址

那么这在 Linux 环境下有什么不同呢?


(http://www.fanqiang.com)



 
 相关文章
探索Linux 操作系统内存模型和管理 (1) 2007-02-07 15:17:08
linux操作系统修改共享内存的简单方法 2007-02-07 15:15:56
Linux实时内存数据库eXtremeDB性能 2006-06-21 10:30:42
让DB2数据库使用所有内存的方法 2006-05-31 15:23:23
C++中堆内存的概念和操作方法入门 2005-04-21 15:13:30
 

★  感谢所有的作者为我们学习技术知识提供了一条捷径  ★
www.fanqiang.com