時鐘

名稱

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

摘要

時鐘是時鐘單調性參考時間軸的一維仿射變換,可由時鐘維護者以原子方式調整,並由用戶端觀察。

說明

屬性

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

ZX_CLOCK_OPT_MONOTONIC

設定後,系統會保證時鐘會呈現單調性行為。也就是說,任何時鐘的觀察序列都保證會產生一連串時間,這些時間一律大於或等於先前的觀察結果。單調時鐘永遠不會倒轉,但可以跳轉。正式:

假設有時鐘 C,讓 C(x) 為從參考時間軸 C's 時間軸對應的函式。C(x) 是一個區塊線性函式,由 C 維護者決定的所有時間內的所有仿射轉換區段組成。C 是單調的,只有在下列情況下才會發生:

針對所有 R1R2R2 >= R1

C(R2) >= C(R1)

ZX_CLOCK_OPT_CONTINUOUS

設定後,時鐘就會保證持續運作。也就是說,時鐘轉換的任何更新都保證與先前的轉換區段保持第一順序連續。正式:

Ci(x)C(x)i 同構轉換片段。假設 Ri 是參考時間軸上的第一個時間點,其中定義了 Ci(x)。時鐘 C 為連續的條件為:對於所有 i

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

備用時間

時鐘的截止時間代表時鐘可設定的最小值。由於時鐘只能向前走,而不能倒轉,因此時鐘觀察器不可能收到小於時鐘建立者設定的截止時間的值。

在建立時,您可以透過 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() 公開「時標」時程。在內部,滴答實際上是時鐘單調性參考時間線,並直接從可供核心存取的架構適當計時器單位讀取。時鐘單調性其實是將以納秒為單位的標準化時間刻度線性轉換。兩個時間軸都會在核心啟動時從零開始計時。

由於時鐘單調性是根據刻度轉換的靜態轉換,而所有核心時鐘都是根據時鐘單調性轉換,因此除了時鐘單調性之外,刻度也可做為核心時鐘的參考時鐘。

擷取時鐘的詳細資料

除了讀取時鐘的目前值之外,具備 ZX_RIGHT_READ 權限的進階使用者也可以讀取時鐘,並在過程中使用 zx_clock_get_details() 取得詳細資料。呼叫成功後,傳回給呼叫端的詳細資料結構會包含:

  • 目前的時鐘單調到時鐘轉換。
  • 目前的時間間隔到時鐘轉換。
  • 時鐘目前的對稱誤差範圍預估值 (如有)。
  • 時鐘上次更新的時間,由時鐘單調參考時間軸定義。
  • 在觀察時鐘時,系統記時器的觀察結果。
  • 在建立時定義的錶面所有靜態屬性。
  • 每次更新時鐘的基礎轉換時,產生值都會變更的產生值。

進階使用者可以利用這些詳細資料,不僅計算時鐘的最近 now 值 (透過使用 Ticks-to-Clock 轉換來轉換已回報的 Ticks-now 觀察值,兩者皆由取得詳細資料作業回報),還可以:

  • 瞭解自上次 zx_clock_get_details() 作業 (使用產生隨機值) 以來,時鐘轉換是否已變更。請注意,時鐘產生的 Nonce 不保證會從任何特定值開始,也不保證會以任何特定方式 (例如以固定值遞增) 在每次更新時變更。相反地,每次更新時,產生值會變更為一個值,且該值保證會與更新發生前立即的值不同。
  • 將時鐘轉換作業與其他時鐘的轉換作業組合,以便推斷兩個時鐘之間的關係。
  • 瞭解時鐘維護者對誤差範圍的最佳估計值。
  • 根據上次校正時間、目前轉換作業和時鐘的最大許可校正因數,推論時鐘相對於參考時鐘的可能未來值範圍 (請參閱上方「|隱含屬性」一節所述的頻率調整作業最大許可範圍)。

啟動時鐘和時鐘信號

建立後,時鐘並未立即開始運作。所有嘗試讀取時鐘的動作都會傳回時鐘設定的截止時間,如果在建立時未指定,則預設為 0。

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

時鐘也有 ZX_CLOCK_STARTED 信號,可讓使用者瞭解時鐘實際啟動時間。這個信號一開始不會設為已設定,但在第一次成功更新作業後就會設為已設定。一旦啟動,時鐘就會持續運作,並且會一律提出 ZX_CLOCK_STARTED 信號。

一開始,時鐘是時鐘單調性的複本,因此時鐘單調性時間軸與合成時間軸之間的轉換函式為恆等函式。建立後,這部時鐘仍可能維持,但須遵守權利、ZX_CLOCK_OPT_MONOTONICZX_CLOCK_OPT_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 授權到期日),則應瞭解系統中哪個元件會維護時鐘,以及維護者在提供錯誤邊界預估值的信心程度時,會提供哪些保證。

SYSCALLS