Zircon 是以物件為基礎的核心。使用者模式程式碼幾乎只能透過物件「控制代碼」與 OS 資源互動。控點可視為一個使用中的工作階段,具有限定於特定資源的 OS 子系統。
Zircon 會主動管理下列資源:
- 處理器時間
- 記憶體和位址空間
- 裝置 iOS 記憶體
- 中斷
- 訊號和等待中
- 處理序間通訊
應用程式的核心物件
處理序間通訊 (IPC)
工作
時段設定
訊號
記憶體與位址空間
等待中
驅動程式的核心物件
核心物件生命週期
核心物件會參照計數。多數核心物件會在「建立」系統呼叫期間建立,且由第一個控點保留,做為建立 syscall 的輸出內容。呼叫端會取得控點的數字 ID,而控點本身則位於程序的控點資料表中。
只要帳號代碼存在於帳號代碼表格中,該帳號代碼就會持續存在。系統可透過以下方式從帳號代碼資料表中移除帳號代碼:
透過
zx_handle_close
關閉這些類別,可減少對應核心物件的參考計數。一般來說,當最後一個控點關閉時,核心物件的參照數量就會達到 0,導致核心物件遭到刪除。如果刪除包含未讀訊息的管道端點,則系統會一併刪除所有待處理訊息,同時關閉訊息中包含的所有控制代碼。
刪除擁有帳號代碼資料表的程序。核心會有效疊代整個控點資料表,依序關閉每個控點。
如果透過 zx_handle_duplicate
建立新控點 (指相同的物件),但同時取得直接指標參照 (由部分核心程式碼) 時,參照次數會增加;因此,核心物件的生命週期可能比建立此物件的程式碼生命週期長。系統也會保留參照物件的使用中控點數量,讓核心在物件的處理量達到零時觸發特定行為,即使核心因直接指標參照導致物件在背景保持運作也一樣。
在以下三個情況中,當核心物件沒有待處理的控制代碼時,核心物件會保持運作:
物件是由訊息中的控制代碼參照,但尚未使用。這種情況可以透過管道 API 進行。儘管這類控制代碼在發布管道中,但核心可讓物件保持運作,主動處理的處理常式數量不為零。
該物件是其他仍有中物件的父項。以連結至執行中 VMAR 的 VMO 為例,也就是有執行中程序或子工作且具有即時執行緒和工作的程序。
執行緒會讓執行緒保持運作。使用中的執行緒會繼續運作,直到呼叫
zx_thread_exit
自行結束,或者透過zx_task_kill
終止程序為止。
最後一個案例的結果是,單一執行緒可保持其程序,並將整個工作歷程,直到根工作為止。
對等互連物件和對等關閉狀態
目前,核心將下列物件類型定義為「對等」物件。
名稱 | 同業關閉信號名稱 |
---|---|
水道 | ZX_CHANNEL_PEER_CLOSED |
通訊端 | ZX_SOCKET_PEER_CLOSED |
芬蘭 | ZX_FIFO_PEER_CLOSED |
事件組合 | ZX_EVENTPAIR_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
系統呼叫從核心傳回之前,在程序中聲明相關聯的訊號。
請注意,當對等互連的有效處理量達到 0 時,物件會放在 PEER_CLOSED
中,即使對等互連物件因核心保留的直接指標參照而持續運作也一樣。
核心物件安全性
核心物件沒有安全性的固有概念,且不會進行授權檢查;安全性權利由各個控點所持有。單一程序可以有兩個不同控制點給同一個物件,但擁有不同權限。