DSCR(資料流控制暫存器)¶
powerpc 中的 DSCR 暫存器允許使用者對處理器中的資料流預取進行一些控制。請參閱 ISA 文件或相關手冊,瞭解有關如何使用此 DSCR 來獲得對預取的控制的更詳細資訊。本文件概述了核心對 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 值已清除(這意味著它尚未更改預設 DSCR),則排程程式會將儲存在 CPU 的 PACA 值中的每個 CPU 的 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 預設值與上述操作完全相同,但與上述全域性 DSCR 預設值不同,它僅更改該特定 CPU 的內容,而不是系統中所有 CPU 的內容。
使用者空間指令
可以使用為此目的提供的以下兩個 SPR 編號中的任何一個,在使用者空間中訪問 DSCR 暫存器。
問題狀態 SPR:0x03(非特權,僅 POWER8)
特權狀態 SPR:0x11(特權)
從使用者空間透過特權 SPR 編號 (0x11) 訪問 DSCR 有效,因為它是在核心中遵循非法指令異常進行模擬的。 mfspr 和 mtspr 指令都進行了模擬。
從使用者空間透過使用者級別 SPR (0x03) 訪問 DSCR 將首先建立一個 facility unavailable 異常。 在此異常處理程式中,所有基於 mfspr 指令的讀取嘗試都將進行模擬並返回,而第一個基於 mtspr 指令的寫入嘗試將透過在 FSCR 暫存器中設定 DSCR facility 來為下一次啟用 DSCR facility(用於讀取和寫入)。
關於“dscr_inherit”的細節
執行緒結構元素“dscr_inherit”表示有問題的執行緒是否嘗試並使用以下任何方法更改了 DSCR 本身。 此元素表示執行緒是否要在核心中使用 CPU 預設 DSCR 值或其自身更改的 DSCR 值。
mtspr 指令(SPR 編號 0x03)
mtspr 指令(SPR 編號 0x11)
ptrace 介面(顯式設定使用者 DSCR 值)
在此事件之後建立的程序的任何子程序也繼承了相同的行為。