DSCR (数据流控制寄存器)

powerpc 中的 DSCR 寄存器允许用户对处理器中的数据流预取进行一定的控制。关于如何使用 DSCR 来实现这种预取控制的详细信息,请参阅 ISA 文档或相关手册。本文档概述了内核对 DSCR 的支持、相关的内核对象、其功能以及导出的用户接口。

  1. 数据结构

    1. thread_struct

      dscr            /* Thread DSCR value */
      dscr_inherit    /* Thread has changed default DSCR */
      
    2. PACA

      dscr_default    /* per-CPU DSCR default value */
      
    3. sysfs.c

      dscr_default    /* System DSCR default value */
      
  2. 调度器变更

    如果线程的 dscr_inherit 值已清零(这意味着它到目前为止尚未更改默认 DSCR),则调度器会将存储在 CPU PACA 值中的每 CPU DSCR 默认值写入寄存器。如果 dscr_inherit 值已设置(这意味着它已经更改了默认 DSCR 值),则调度器会将现在包含在线程结构体(thread struct)dscr 中的更改后的值写入寄存器,而不是写入基于 PACA 的每 CPU 默认 DSCR 值。

    注意:请注意,系统范围的全局 DSCR 值在调度器进程上下文切换中从不被直接使用。

  3. SYSFS 接口

    • 全局 DSCR 默认值:/sys/devices/system/cpu/dscr_default

    • CPU 特定的 DSCR 默认值:/sys/devices/system/cpu/cpuN/dscr

    在 sysfs 中更改全局 DSCR 默认值将立即更改其 PACA 结构中所有 CPU 特定的 DSCR 默认值。同样,如果当前进程的 dscr_inherit 已清零,它还会立即将新值写入每个 CPU 的 DSCR 寄存器,并同时更新当前线程的 DSCR 值。

    在 sysfs 中更改特定 CPU 的 DSCR 默认值与上述操作完全相同,但与上述全局更改不同的是,它只更改该特定 CPU 的内容,而不是系统上的所有 CPU。

  4. 用户空间指令

    DSCR 寄存器可以在用户空间中使用为此目的提供的两个 SPR 编号中的任意一个进行访问。

    1. 问题状态 SPR:0x03(非特权,仅限 POWER8)

    2. 特权状态 SPR:0x11(特权)

    从用户空间通过特权 SPR 编号 (0x11) 访问 DSCR 是可行的,因为它是在内核内部发生非法指令异常后进行模拟的。mfspr 和 mtspr 指令均会被模拟。

    从用户空间通过用户级 SPR (0x03) 访问 DSCR 首先会产生一个“设施不可用”(facility unavailable)异常。在此异常处理程序中,所有基于 mfspr 指令的读取尝试都将被模拟并返回,而第一次基于 mtspr 指令的写入尝试将通过在 FSCR 寄存器中设置 DSCR 设施来为下一次访问(包括读取和写入)启用 DSCR 设施。

  5. 关于 ‘dscr_inherit’ 的具体细节

    线程 struct element ‘dscr_inherit’ 表示相关线程是否已尝试并使用以下任何方法更改了 DSCR。该元素表明线程是希望在内核中使用 CPU 默认的 DSCR 值,还是使用其自身更改后的 DSCR 值。

    1. mtspr 指令 (SPR 编号 0x03)

    2. mtspr 指令 (SPR 编号 0x11)

    3. ptrace 接口 (显式设置用户 DSCR 值)

    此事件发生后在该进程中创建的任何子进程也会继承此行为。