Zircon 是以物件為基礎的核心。使用者模式程式碼幾乎只會透過物件控制代碼與 OS 資源互動。您可以將控制代碼視為與特定資源範圍內的特定 OS 子系統進行中的工作階段。
Zircon 會主動管理下列資源:
- 處理器時間
- 記憶體和位址空間
- 裝置 I/O 記憶體
- 中斷
- 發出信號並等待
- 程序間通訊
應用程式的核心物件
一般
IPC
工作
時段設定
訊號
記憶體和位址空間
等待中
驅動程式的核心物件
核心物件生命週期
核心物件會參照計數。大多數核心物件都是在「建立」系統呼叫期間建立,並由第一個控制代碼 (做為建立系統呼叫的輸出內容) 維持存留。呼叫端會取得控制代碼的數字 ID,控制代碼本身則會放在程序的控制代碼資料表中。
只要控制代碼存在於控制代碼資料表中,就會保持有效。控制代碼會透過下列方式從控制代碼表格中移除:
透過
zx_handle_close關閉,這會遞減對應核心物件的參照計數。通常,當最後一個控制代碼關閉時,核心物件參照計數會達到 0,導致核心物件遭到毀損。當含有控制代碼的未讀訊息所在的管道端點遭到毀損時,所有待處理的訊息也會遭到毀損,並在毀損過程中關閉訊息中包含的所有控制代碼。
擁有控制代碼資料表的程序遭到終止時。核心會有效率地逐一關閉控制代碼,反覆處理整個控制代碼資料表。
透過 zx_handle_duplicate 建立新控制代碼 (參照相同物件) 時,參照計數會增加,但取得直接指標參照 (透過某些核心程式碼) 時也會增加;因此,核心物件的生命週期可能會比建立該物件的程式碼生命週期更長。系統也會維護參照物件的有效控制碼個別計數,讓核心在物件的控制碼計數達到零時觸發特定行為,即使核心因直接指標參照而讓物件在幕後保持運作也一樣。
在沒有未處理的控制代碼時,核心物件仍會保持存留狀態,以下是三種重要情況:
訊息中的控制代碼參照了該物件,但該訊息尚未耗用。 這項作業可透過頻道 API 完成。只要這類控制代碼位於管道中,核心就會讓物件保持運作,並維持非零的有效控制代碼計數。
該物件是另一個存續物件的父項。例如附加至即時 VMAR 的 VMO、具有即時執行緒的程序,以及具有即時程序或子項工作的工作。
排程器會讓執行緒保持運作。只要執行緒處於運作狀態,就會持續運作,直到呼叫
zx_thread_exit自行結束,或是透過zx_task_kill終止程序為止。
最後一個案例的結果是,單一執行緒可以讓程序和整個工作沿襲 (直到根工作) 保持運作。
對等物件和對等關閉狀態
目前,核心會將下列物件類型定義為「對等」物件。
| 名稱 | Peer-Closed Signal Name |
|---|---|
| 頻道 | ZX_CHANNEL_PEER_CLOSED |
| Socket | ZX_SOCKET_PEER_CLOSED |
| 先進先出 | ZX_FIFO_PEER_CLOSED |
| 活動配對 | ZX_EVENTPAIR_PEER_CLOSED |
| IOBuffer | ZX_IOB_PEER_CLOSED |
所有對等物件都是成對建立,並在對等關係中彼此內部連結。當對等物件的有效控制代碼計數達到 0 時,如果該物件仍有連結至對等物件,對等物件會進入 PEER_CLOSED 狀態,導致連結遭到毀損、對等物件上會斷言特定 ZX_*_PEER_CLOSED 信號,且涉及物件對等項的系統呼叫 (例如 zx_channel_write) 會傳回 ZX_ERR_PEER_CLOSED 錯誤。
透過呼叫 zx_handle_close 或 zx_handle_close_many 關閉物件的最終控制代碼時,系統保證物件的對等互連 (如有) 會進入 PEER_CLOSED 狀態,在 zx_handle_close 系統呼叫從核心回傳之前,在程序中判斷相關聯的信號。
請注意,當同層級的有效控制代碼計數達到零時,物件會放入 PEER_CLOSED,即使同層級物件因核心持有的直接指標參照而繼續存在也一樣。
核心物件安全性
核心物件沒有固有的安全性概念,也不會執行授權檢查;安全性權限由每個控制代碼持有。單一程序可擁有相同物件的兩個不同控制代碼,但權限不同。