💭 写在前面
本系列博客为复习操作系统导论的笔记,内容主要参考自:
- Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne,
- Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .
- DISCOS
0x00 什么是分段(What is Segmentation)
"分段 —— 泛化的基址 / 界限"
- 分段并不是一个新的概念,它甚至可以追溯到 20 世纪 60 年代初期。
- 该想法很简单,在 MMU 中引入不止一个基址和界限寄存器对。
- A process can have logically-different segments: Code (Data), Stack and Heap., which is just a contiguous portion of the address space. 一个段只是地址空间里的一个连续定长的区域,在典型的地址里有3个逻辑不通的段:代码、栈和堆。
每个分段可以:
- be placed separately in physical memory. 被单独放置在物理内存中。
- grow and shrink (i.e., each segment has variable size). 柔性(即每个段的大小是可变的)。
- be independently protected (separate read/write/execute protection bits). 被独立保护(独立的读/写/执行保护位)。
Segmentation allows the OS to place each one of those segments(Code, Stack, and Heap) in different parts of physical memory, and thus avoid filling physical memory with unused virtual address space 分段允许操作系统将每一个段(代码、栈和堆)放在物理内存的不同部分,从而避免用未使用的虚拟地址空间填满物理内存。
分段的机制使得操作系统能将不同的段放到不同的物理内存区域,从而避免了虚地址空间中的未使用部分占用内存。
0x01 地址分段(Segmented Addressing)
现在的逻辑地址由段 # 和段内偏移量组成,进程是如何指定一个特定的段的?
- 逻辑地址的高位用于选择段(segment #)。
- 逻辑地址的低位用于选择段内的偏移。
MMU contains Segment Table (per process)
- Each segment has own BASE and BOUNDS, and protection bits. 每个段有自己的BASE和BOUNDS,以及保护位。
- Example: 14 bit logical address, 4 segments; how many bits are needed for segment and offset? How big is the segment? 例如:14位逻辑地址,4个段;段和偏移需要多少位?该段有多大?
0x02 带分段的地址转换(Address Translations with Segmentation)
// get top 2 bits of 14-bit VA Segment = (VirtualAddress & SEG_MASK) >> SEG_SHIFT // now get offset Offset = VirtualAddress & OFFSET_MASK if (Offset >= Bounds[Segment]) RaiseException(PROTECTION_FAULT) else PhysAddr = Base[Segment] + Offset Register = AccessMemory(PhysAddr)
SEG_MASK = 0x3000(11000000000000)
SEG_SHIFT = 12
OFFSET_MASK = 0xFFF (00111111111111)
优点:
- Enables sparse allocation of address space. 启用地址空间的稀疏分配。
- Stack and heap can grow independently. 栈和堆可以独立增长。
- Different protection for different segments. 对不同的段有不同的保护。
- Read-only status for code 代码的只读状态
- Enables sharing of selected segments. 启用选定段的共享
- Supports dynamic relocation of each segment. 支持每个段的动态重定位
缺点:
Each segment must be allocated contiguously. 每个段必须是连续分配的。
May not have sufficient physical memory for large segments, resulting in external fragmentation. 可能没有足够的物理内存用于大的段,导致外部碎片化。
补充:段错误
段错误指的是在支持分段的机器上发生了非法的内存访问。有趣的是,即使在不支持分段的机器上这个术语依然保留。但如果你弄不清楚为什么代码老是出错,就没那么有趣了。
📌 [ 笔者 ] 王亦优 📃 [ 更新 ] 2022. ❌ [ 勘误 ] /* 暂无 */ 📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免, 本人也很想知道这些错误,恳望读者批评指正!
📜 参考资料 Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces A. Silberschatz, P. Galvin, and G. Gagne, Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7. Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . 百度百科[EB/OL]. []. https://baike.baidu.com/. |