DSCR(資料流控制暫存器)

powerpc 中的 DSCR 暫存器允許使用者對處理器中的資料流預取進行一些控制。請參閱 ISA 文件或相關手冊,瞭解有關如何使用此 DSCR 來獲得對預取的控制的更詳細資訊。本文件概述了核心對 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 值,則排程程式會將更改的值寫入暫存器(該值現在將包含線上程結構的 dscr 中),而不是基於每個 CPU 預設的 PACA 的 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 預設值與上述操作完全相同,但與上述全域性 DSCR 預設值不同,它僅更改該特定 CPU 的內容,而不是系統中所有 CPU 的內容。

  4. 使用者空間指令

    可以使用為此目的提供的以下兩個 SPR 編號中的任何一個,在使用者空間中訪問 DSCR 暫存器。

    1. 問題狀態 SPR:0x03(非特權,僅 POWER8)

    2. 特權狀態 SPR:0x11(特權)

    從使用者空間透過特權 SPR 編號 (0x11) 訪問 DSCR 有效,因為它是在核心中遵循非法指令異常進行模擬的。 mfspr 和 mtspr 指令都進行了模擬。

    從使用者空間透過使用者級別 SPR (0x03) 訪問 DSCR 將首先建立一個 facility unavailable 異常。 在此異常處理程式中,所有基於 mfspr 指令的讀取嘗試都將進行模擬並返回,而第一個基於 mtspr 指令的寫入嘗試將透過在 FSCR 暫存器中設定 DSCR facility 來為下一次啟用 DSCR facility(用於讀取和寫入)。

  5. 關於“dscr_inherit”的細節

    執行緒結構元素“dscr_inherit”表示有問題的執行緒是否嘗試並使用以下任何方法更改了 DSCR 本身。 此元素表示執行緒是否要在核心中使用 CPU 預設 DSCR 值或其自身更改的 DSCR 值。

    1. mtspr 指令(SPR 編號 0x03)

    2. mtspr 指令(SPR 編號 0x11)

    3. ptrace 介面(顯式設定使用者 DSCR 值)

    在此事件之後建立的程序的任何子程序也繼承了相同的行為。