跳转到内容

操作系统设计/分段

来自维基教科书,开放的书籍,为开放的世界

分段是实现内存保护最常见的方法之一。在使用分段的计算机系统中,引用内存位置的指令操作数包含一个值,该值标识一个段和该段内的偏移量。一个段具有与之关联的一组权限和长度。如果当前运行的进程被权限允许进行它试图进行的内存引用类型,并且段内的偏移量在段长度指定的范围内,则允许该引用;否则,将引发硬件异常。

除了权限集和长度之外,一个段还与之关联的信息指示该段在内存中的位置。它可能还包含一个标志,指示该段是否存在于主内存中;如果该段不存在于主内存中,将引发异常,操作系统将从辅助存储器中将该段读入内存。指示段在内存中的位置的信息可能是段中第一个位置的地址,也可能是段的页表地址,如果分段是使用分页实现的。在第一种情况下,如果对段内某个位置的引用,则段内偏移量将添加到段中第一个位置的地址,以给出所引用项在内存中的地址;在第二种情况下,段的偏移量将使用页表转换为内存地址。

在大多数段没有关联页表的系统中,段中第一个位置的地址是主内存中的地址;在这些系统中,不进行分页。在 Intel 80386 及更高版本中,该地址可以是主内存中的地址(如果禁用分页),也可以是分页的“线性”地址空间中的地址(如果启用分页)。

内存管理单元 (MMU) 负责将段和该段内的偏移量转换为内存地址,并执行检查以确保可以进行转换,并且对该段和偏移量的引用是允许的。

这种用法不应与早期 x86 处理器(如 Intel 8086 和 Intel 8088)使用的内存段混淆,因为它们没有提供任何保护(任何程序都可以不受限制地访问任何段,并且一个段仅包含一个起始位置和一个固定的 64 KiB 长度);Intel 80286 及更高版本的分段提供了保护。它保护主内存的文件。

华夏公益教科书