为什么段开始于段落边界?

时间:2010-02-27 17:38:38

标签: memory-management assembly x86

在实模式分段内存模型中,段始终从段落边界开始。一个段落大小为16个字节,因此段地址总是可以被16整除。段落边界上有段的原因/好处是什么?

3 个答案:

答案 0 :(得分:4)

它不是一个公理的好处 - 8086的实模式分割模型是在硬件级别设计的,这样段寄存器指定了段落边界。

段寄存器指定了8086的20位地址空间的高16位的基址,该基址的低4位实质上被强制为零。

分段架构是让8086的16位寄存器架构能够处理完整兆字节(!)地址空间(需要20位寻址)的一种方法。

对于更多的历史记录,英特尔在x86架构中采取的下一步是从直接定义基址的抽象段寄存器中抽象出来。那是286保护模式,其中段寄存器保持一个“选择器”而不是定义物理基地址的位是一组描述符表的索引,该表描述符表保存有关物理地址的信息,访问物理的权限记忆和其他事情。

现代32位或更大版本的x86处理器中的段寄存器仍然可以。但是,由于地址偏移能够指定完整的32位寻址(或x64处理器上的64位),并且页表能够在由选择器定义的段内提供虚拟内存语义,编程模型基本上不再使用必须在应用程序级别操作段寄存器。在大多数情况下,操作系统会将段寄存器设置一次,而其他任何内容都不需要处理它们。所以程序员通常甚至不需要知道它们的存在。

答案 1 :(得分:3)

8086有20条地址线。该段被映射到前16个,留下了底部4行的偏移量,或16个地址。

答案 2 :(得分:1)

段寄存器存储存储位置的地址该段开始的位置。但是段寄存器存储16位信息。通过在地址的右端附加4位0来将该16位转换为20位。如果段寄存器包含1000H,则将其左移以获得10000H。现在是20位。

转换时,我们在地址末尾添加了4位0。因此,内存中的每个段都必须以内存位置开始,其中最后4位为0。

例如:

如果一个段从10001H内存位置开始,我们无法访问它,因为最后4位不是0。 段寄存器中的任何地址都将在右端附加4位以转换为20位。因此无法访问此类地址。