DSCR (数据流控制寄存器)¶
powerpc 中的 DSCR 寄存器允许用户对处理器中的数据流预取进行一些控制。有关如何使用此 DSCR 来实现预取控制的更多详细信息,请参阅 ISA 文档或相关手册。本文档概述了内核对 DSCR 的支持、相关的内核对象、其功能和导出的用户界面。
数据结构
thread_struct
dscr /* Thread DSCR value */ dscr_inherit /* Thread has changed default DSCR */
PACA
dscr_default /* per-CPU DSCR default value */
sysfs.c
dscr_default /* System DSCR default value */
调度程序更改
如果线程的 dscr_inherit 值被清除,则调度程序会将存储在 CPU PACA 值中的每个 CPU 的 DSCR 默认值写入寄存器,这意味着该线程到目前为止尚未更改默认 DSCR。如果设置了 dscr_inherit 值,这意味着它已更改了默认 DSCR 值,调度程序会将更改后的值写入寄存器,该值现在将包含在线程结构的 dscr 中,而不是每个 CPU 的基于 PACA 的默认 DSCR 值。
注意:请注意,系统范围的全局 DSCR 值在调度程序进程上下文切换中根本不会直接使用。
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。
用户空间指令
可以使用为此目的提供的以下两个 SPR 编号中的任何一个在用户空间中访问 DSCR 寄存器。
问题状态 SPR:0x03(非特权,仅限 POWER8)
特权状态 SPR:0x11(特权)
从用户空间通过特权 SPR 编号 (0x11) 访问 DSCR 可以工作,因为它是在内核中非法指令异常后模拟的。mfspr 和 mtspr 指令都被模拟。
从用户空间通过用户级别 SPR (0x03) 访问 DSCR 将首先创建一个设施不可用异常。在此异常处理程序中,所有基于 mfspr 指令的读取尝试都将被模拟并返回,而第一次基于 mtspr 指令的写入尝试将通过在 FSCR 寄存器中设置 DSCR 设施来为下一次启用 DSCR 设施(读取和写入)。
关于“dscr_inherit”的详细信息
线程结构元素“dscr_inherit”表示该线程是否已尝试并使用以下任何方法更改了 DSCR 本身。此元素表示该线程是否要在内核中使用 CPU 默认 DSCR 值或其自身更改的 DSCR 值。
mtspr 指令 (SPR 编号 0x03)
mtspr 指令 (SPR 编号 0x11)
ptrace 接口(显式设置用户 DSCR 值)
在此事件之后创建的进程的任何子进程也会继承相同的行为。