時鐘

NAME

時鐘 - 用於追蹤時間進度的核心物件。

概要

時鐘是時鐘單調參考時間軸的維度仿造轉換,可由時鐘維護器以不可分割的形式調整,並且由用戶端觀察。

說明

屬性

時鐘的屬性會在建立時建立,而且之後無法更改。目前,已定義三個時鐘屬性。

ZX_CLOCK_OPT_MONOTONIC

設定後,時鐘保證具有單調行為。這表示,任何時鐘的觀察序列保證會產生一連串的時間,一律大於或等於先前的觀察結果。單調時鐘可以向前跳轉,但永遠無法反向。正式程度:

假設時鐘為 C,則 C(x) 是參考時間軸 C 時間軸對應的函式。C(x) 是由 C 維護人員決定,隨時由所有仿製轉換片段構成的分段線性函式。只有在下列情況中,C 才是單調性:

所有 R1R2R2 >= R1

C(R2) >= C(R1)

ZX_CLOCK_OPT_CONTINUOUS

設定後,時鐘會保證將行為保持不間斷。這表示,任何時鐘轉換的更新保證都會與前一個轉換片段進行先後順序排列。正式程度:

Ci(x) 成為 C(x) 個仿射轉換片段。讓 Ri 成為參考時間軸上定義 Ci(x) 的第一個時間點。只有在所有 i 時,時鐘 C 才會持續運作

Ci(Ri + 1) = Ci + 1(Ri + 1)

Backstop 時間

時鐘的回溯時間代表時鐘可設定的最小值。由於時鐘只能向前推移,並且永不向後反轉,因此時鐘的觀察器無法取得小於時鐘建立器設定的返回停靠時間的值。

可以在建立時透過 zx_create_args_v1_t 結構提供回溯時間。否則將預設為 0。

在時鐘更新作業期間,任何嘗試將時鐘值設為小於返回停止時間的任何嘗試都會失敗,並顯示 ZX_ERR_INVALID_ARGS。尚未最初設定的時鐘一律會報告為時鐘設定的返回停止時間。背部時間絕不會小於預設值 0。

隱含屬性

  • 系統中所有時鐘物件的參考時鐘是時鐘單調式。
  • 所有時鐘物件的名詞單位皆指定為奈秒。此屬性無法設定。
  • 所有時鐘物件的頻率調整單位為每百萬 (或 PPM) 的單位。
  • 時鐘物件的頻率調整上限範圍指定為 [-1000, +1000] PPM。這個屬性無法設定。

其他建立選項

ZX_CLOCK_OPT_AUTO_START

在時鐘建立期間使用這個選項時,時鐘會從已啟動狀態開始,而不是預設的非啟動狀態。詳情請參閱「啟動時鐘」。

解讀時鐘

如為時鐘控點,使用者可使用 zx_clock_read() 系統呼叫查詢該時鐘目前指定的時間。時鐘讀取 ZX_RIGHT_READ 權限。時鐘讀取保證適用於所有觀察器。這表示,如果兩個觀察器在相同的參考時間 R 中查詢時鐘,那麼這兩個觀察器會一直看到相同的 C(R) 值。

參考時間表、zx_ticks_get()zx_clock_get_monotonic()

如先前所述,zx_clock_get_monotonic() 是使用者建立的 Zircon 時鐘的參考時間軸。這表示如果使用者知道時鐘執行個體目前的轉換,然後在時鐘例項的時間軸上提供值,即可計算時鐘單調時間軸上的對應點 (以及反之)。這也表示若核心時鐘、時鐘單調和核心時鐘未經過速率調整,其速率會完全相同。

除了時鐘單調時間軸外,Zircon 核心也會透過 zx_ticks_get()zx_ticks_per_second() 公開「滴答」時間軸。在內部,滴答實際上是時鐘單音的參考時間軸,系統會直接從核心可存取的架構相關計時器單元讀取。時鐘單調是將刻點時間軸正規化為奈秒單位的線性轉換。當核心開始時,兩個時間軸都會從 0 開始滴答。

因為時鐘單調是一種根據刻點而產生的靜態轉換,所有核心卡都是根據時鐘單調的轉換,因此除了時鐘單調之外,滴答也可以作為核心時鐘的參照時鐘。

正在擷取時鐘的詳細資料

除了僅讀取時鐘目前的值外,擁有 ZX_RIGHT_READ 權限的進階使用者還可以讀取時鐘,並使用 zx_clock_get_details() 在過程中取得更深入的詳細資料。成功呼叫後,傳回呼叫端的詳細資料結構將包含:

  • 目前時鐘對時鐘轉換的單調。
  • 目前對時鐘轉換的刻點。
  • 時鐘目前的對稱錯誤繫結預估 (如果有的話)。
  • 上次由時鐘單調參照時間軸定義的時鐘更新的時間。
  • 觀察系統刻度計數器,用於觀察時鐘。
  • 建立時定義的時鐘所有靜態屬性。
  • 世代 Nonce。

進階使用者不僅可以使用這些詳細資料計算時鐘的近期 now 值 (使用滴答轉換轉換,透過 get 詳細資料運算來轉換回報的現狀觀察),也可以:

  • 瞭解時鐘轉換自上次 zx_clock_get_details() 作業以來是否變更 (使用產生 Nonce)。
  • 搭配使用時鐘轉換與其他時鐘的轉換,以推理兩個時鐘之間的關係。
  • 瞭解時鐘維護器的最佳錯誤範圍預估值。
  • 依據上次校正時間、目前轉換,以及時鐘的最大允許修正係數,說明時鐘相對於參照時鐘的可能未來值範圍 (請參閱上文 |隱式屬性| 一節中所述的最大頻率調整範圍)。

啟動時鐘與時鐘信號

時鐘建立完成後便立即未開始計時。所有嘗試讀取時鐘的情況都會傳回時鐘設定的往返時間,如果在建立期間未指定,則預設值為 0。

時鐘會在維護器執行第一次更新作業後開始執行,必須包含設定值作業。時鐘會從該時間點開始運作,其速率等於參考時鐘,再加上維護者指定的名詞偏差。

時鐘也具有 ZX_CLOCK_STARTED 信號,使用者可以用來得知時鐘實際開始的時間。這個信號一開始並未設定,但會在第一次成功更新作業後設定。啟動後,時鐘就不會停止,系統一律會宣告 ZX_CLOCK_STARTED 信號。

時鐘最初是時鐘單調的複本,這使得身分函式在時鐘單調時間軸和合成時間軸之間進行轉換。這個時鐘在建立後可能仍會「保留」,但會受到權限設下的限制、ZX_CLOCK_opt_MONOTONICZX_CLOCK_PRE_CONTINUOUS 屬性,以及設定的返回停靠時間限制。

如果使用 ZX_CLOCK_OPT_AUTO_START 選項建立時鐘,則該時鐘設定的返回停止時間不得大於目前的時鐘單曲時間。如果允許,就會造成時鐘的目前時間設為往回停止時間之前的時間。

保持時鐘

擁有時鐘物件 ZX_RIGHT_WRITE 權限的使用者可以使用 zx_clock_update() 系統呼叫做為時鐘的維護者。每次呼叫 zx_clock_update() 時,時鐘的三個參數都可以調整,但不需要每次都調整。可能的值包括:

  • 時鐘的絕對值。
  • 時鐘的頻率調整 (與名詞的差距,以 ppm 表示)
  • 時鐘的絕對錯誤邊界預估值 (以奈秒表示)

變更時鐘轉換會在系統呼叫本身期間發生。使用者可能無法指定調整的確切參考時間。

如果在設定 ZX_CLOCK_OPT_MONOTONIC 屬性的情況下對時鐘的絕對值做出任何變更,會導致非單調行為失敗,並傳回 ZX_ERR_INVALID_ARGS 的傳回碼。

第一個更新作業是從時鐘滴答聲啟動,必須包含設定值作業。

除了第一次設定值作業以外,所有在設定 ZX_CLOCK_OPT_CONTINUOUS 屬性的情況下嘗試設定時鐘的絕對值,都會失敗並傳回 ZX_ERR_INVALID_ARGS

時鐘錯誤繫結預估注意事項

zx_clock_get_details() 系統呼叫可為使用者提供有關時鐘的許多詳細資料,包括「錯誤繫結預估值」。這個值以奈秒表示,代表時鐘維護人員目前對時鐘目前可能相對於維護人員所用參照的錯誤的估計值誤差。舉例來說,如果使用者擷取的時間 X 且預估為 E 的錯誤,則時鐘維護器會嘗試判斷該時鐘的實際值位於 [ X-E, X+E ] 範圍內。

核心 API「不」指定這項預估值的可信度等級。有些時鐘維護人員可能會使用嚴格限制,某些則可能會使用無法證明,卻提供「高可信度」的界限,而有些則可能幾乎沒有自信地估算其預估值。

如果是使用者需要瞭解所存取錯誤估計值的客觀品質 (例如強制執行憑證有效性日期,或 DRM 授權到期),他們必須瞭解系統中哪個元件需要維持時鐘,以及維護者在發布錯誤邊界預估的信賴水準時提供的保證。

音效