关于段访问机制
一、段访问机制的核心概念
1. 什么是“段”?
- 定义:一个段是内存中的逻辑地址空间块(如图片左侧说明:“一个段——一个内存‘块’”)。
- 特点:
- 段对应程序的功能模块(如代码段、数据段、栈段等)。
- 每个段有独立的大小、权限和物理位置(非连续分配)。
2. 逻辑地址的二维结构
- 程序访问内存时需提供 二元组
(s, addr)
:s
(段号):标识目标段(如s=0
为代码段,s=1
为数据段)。addr
(段内偏移):段内具体位置的偏移量(如代码段中第100条指令)。
- 示例:
- 访问数据段中第50字节 → 逻辑地址 =
(1, 50)
。
- 访问数据段中第50字节 → 逻辑地址 =
二、段访问的两种实现方案
图片下方展示了两种硬件实现方案:
方案1:段寄存器 + 地址寄存器(左侧示意图)
- 硬件支持:
- 段寄存器(Segment Register):存储当前段号
s
(如s = n₂
)。 - 地址寄存器(Address Register):存储段内偏移
addr
。
- 段寄存器(Segment Register):存储当前段号
- 工作流程:
- CPU 执行指令时,将逻辑地址
(s, addr)
拆解:s
存入段寄存器。addr
存入地址寄存器。
- 硬件自动转换:
- 通过段表(Segment Table)查询段号
s
对应的基址(Base Address) 和段长(Limit)。 - 检查偏移
addr
是否合法(addr ≤ Limit
)。 - 物理地址 = 基址 + addr。
- 通过段表(Segment Table)查询段号
- CPU 执行指令时,将逻辑地址
- 优势:
- 硬件加速转换(专用寄存器减少延迟)。
- 权限检查实时完成(如禁止写只读代码段)。
- 示意图关键点:
- 浅蓝色块表示不同段(
n₁
,n₂
),右侧的0
表示段结束边界(隐含段长限制)。
- 浅蓝色块表示不同段(
方案2:单地址实现方案(右侧示意图)
- 硬件支持:
- 单一地址寄存器:存储拼接后的地址(将
s
和addr
合并为一个值)。
- 单一地址寄存器:存储拼接后的地址(将
- 工作流程:
- 逻辑地址
(s, addr)
被编码为单值(如高比特位 =s
,低比特位 =addr
)。- 示例:32位地址 = 高16位存
s
+ 低16位存addr
。
- 示例:32位地址 = 高16位存
- 软件/硬件转换:
- 方式1(软件):操作系统截取高比特位作为
s
,查段表获取基址,再与低比特位addr
相加。 - 方式2(硬件):MMU 自动拆分
s
和addr
,通过段表转换(类似方案1)。
- 方式1(软件):操作系统截取高比特位作为
- 逻辑地址
- 优势:
- 兼容传统单地址寻址体系(简化指令设计)。
- 节省专用寄存器成本。
- 示意图关键点:
- 紫色标签
s
和addr
通过曲线连接,表示二者拼接为单一地址值。 - 段号
n
和结束标志0
体现段边界。
- 紫色标签
三、段访问机制的核心价值
- 解决外部碎片:
- 段间物理内存非连续分配 → 避免内存碎片化(如图中浅蓝色块分散分布)。
- 模块化保护:
- 每个段可设置独立权限(如代码段只读、栈段可读写)→ 防止非法访问。
- 支持动态扩展:
- 堆段、栈段可按需增长(只需分配新物理块并更新段表)。
- 共享内存优化:
- 多个进程可共享同一物理段(如公共库代码段)→ 减少冗余拷贝。
四、段访问的底层依赖:段表(Segment Table)
- 段表结构(图片未直接展示,但隐含存在):
段号(s) 基址(Base) 段长(Limit) 权限 0 0x8000 1024KB R-X 1 0x2000 512KB RW- - 转换过程:
(s, addr)
→ 查表 → 验证权限 → 物理地址 =Base + addr
。
五、现代系统的应用
- x86架构实模式:直接使用段寄存器(CS、DS等)。
- x86保护模式:段表升级为全局描述符表(GDT),段寄存器存储段选择符(索引GDT)。
- RISC架构(如ARM):简化分段,侧重分页机制,但逻辑段概念仍存在(如代码/数据分区)。
总结
图片阐释的 段访问机制 本质是:
- 逻辑二维地址:
(s, addr)
解耦程序模块与物理位置。 - 两种硬件方案:
- 专用寄存器方案:高效但成本高(左侧图)。
- 单地址拼接方案:兼容性强(右侧图)。
- 核心目标:
- 非连续分配 → 提升内存利用率。
- 段级保护 → 增强系统安全性。
此机制是操作系统实现进程隔离和虚拟内存的重要基础(尽管现代系统常与分页结合为“段页式”架构)。