名稱
clock - 用於追蹤時間進度的核心物件。
摘要
時鐘是時鐘單調性參考時間軸的一維仿射變換,可由時鐘維護者以原子方式調整,並由用戶端觀察。
說明
屬性
時鐘的屬性會在時鐘建立時建立,之後便無法變更。目前已定義三個時鐘屬性。
ZX_CLOCK_OPT_MONOTONIC
設定後,系統會保證時鐘會呈現單調性行為。也就是說,任何時鐘的觀察序列都保證會產生一連串時間,這些時間一律大於或等於先前的觀察結果。單調時鐘永遠不會倒轉,但可以跳轉。正式:
假設有時鐘 C,讓 C(x) 為從參考時間軸 C's 時間軸對應的函式。C(x) 是一個區塊線性函式,由 C 維護者決定的所有時間內的所有仿射轉換區段組成。C 是單調的,只有在下列情況下才會發生:
針對所有 R1、R2:R2 >= 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_MONOTONIC 和 ZX_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
- 時鐘轉換
zx_clock_create()
- 建立時鐘zx_clock_read()
- 讀取時鐘的時間zx_clock_get_details()
- 擷取時鐘與時鐘單調函式之間的關係詳細資料zx_clock_update()
:調整時鐘與時鐘單調參照的目前關係。