在现代x86系统中,如何在保护模式内存寻址中使用段寄存器?

时间:2017-08-31 06:20:14

标签: x86 operating-system memory-segmentation

我理解分段是如何工作的,并且分页是现代操作系统中内存访问的首选方式。但我不确定段寄存器的使用方式:

  1. 他们只是 APPEAR 未使用,因为它们通常具有基数0和限制0xFFFFFFFF。请注意,在这种情况下,它们仍然涉及物理地址计算,但是是透明的并且提供平坦的内存模型。
  2. 它们完全不受影响。

1 个答案:

答案 0 :(得分:3)

也许是他们的有趣组合。从高级别(如果它可以称为高级)透视图发生的情况是,大多数段配置为基数为0且限制为0xFFFFFFFF(fsgs可用于特殊目的)。

但是,配置具有非零基础的段可能会产生性能影响。例如,在AMD K8和K10上,将代码段配置为具有非零基数会将分支错误预测的延迟增加两个周期,如果涉及具有非零基数的段,则通用地址花费更长的时间来计算。这可能意味着处理器对于基数为零的段具有特殊的快速路径,因此基数根本不参与地址的计算而不是加零(这仍然需要时间)。

我找不到任何其他μarchs上存在的这种效应的参考,但它可能没有被完全探索,因为它是一种相对罕见的效果,尤其是在对性能敏感的代码中。在一个快速测试中,Haswell似乎存在类似的效果,使用此代码(跳过一些简单的设置):

.loop:
    mov rax, [rsp+rax]
    add ecx, 1
    jnz .loop

每次迭代运行两个周期(5个周期/迭代)比此代码(7个周期/迭代)更快:

.loop:
    mov rax, [gs:rax]
    add ecx, 1
    jnz .loop

可能这意味着更多的英特尔μarchs也会受到影响,但这可能是不准确的,因为根本没有任何段涉及第一个代码(因为它是64位代码),也许 是重要的