段控制单元模型概述
这种分段模型背后的基本思想是将内存分段管理。从本质上来说,每个段就是自己的地址空间。段由两个元素构成:
●基址 (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)中。

每次将段选择器加载到段寄存器中时,对应的段描述符都会从内存加载到相匹配的不可编程 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。

那么这在 Linux 环境下有什么不同呢?
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9417382/viewspace-940037/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9417382/viewspace-940037/
本文深入探讨了Linux操作系统下的内存管理模型,重点介绍了段控制单元模型,解析了如何通过段选择器和段描述符来实现内存分段管理。此外,文章还详细解释了段描述符的组成及其在全局描述符表(GDT)和本地描述符表(LDT)中的存储方式。

被折叠的 条评论
为什么被折叠?



