Zircon 核心物件

Zircon 是以物件為基礎的核心。使用者模式程式碼幾乎只能透過物件「控制代碼」與 OS 資源互動。控點可視為一個使用中的工作階段,具有限定於特定資源的 OS 子系統。

Zircon 會主動管理下列資源:

  • 處理器時間
  • 記憶體和位址空間
  • 裝置 iOS 記憶體
  • 中斷
  • 訊號和等待中
  • 處理序間通訊

應用程式的核心物件

處理序間通訊 (IPC)

工作

時段設定

訊號

記憶體與位址空間

等待中

驅動程式的核心物件

核心物件生命週期

核心物件會參照計數。多數核心物件會在「建立」系統呼叫期間建立,且由第一個控點保留,做為建立 syscall 的輸出內容。呼叫端會取得控點的數字 ID,而控點本身則位於程序的控點資料表中。

只要帳號代碼存在於帳號代碼表格中,該帳號代碼就會持續存在。系統可透過以下方式從帳號代碼資料表中移除帳號代碼:

  • 透過 zx_handle_close 關閉這些類別,可減少對應核心物件的參考計數。一般來說,當最後一個控點關閉時,核心物件的參照數量就會達到 0,導致核心物件遭到刪除。

  • 如果刪除包含未讀訊息的管道端點,則系統會一併刪除所有待處理訊息,同時關閉訊息中包含的所有控制代碼。

  • 刪除擁有帳號代碼資料表的程序。核心會有效疊代整個控點資料表,依序關閉每個控點。

如果透過 zx_handle_duplicate 建立新控點 (指相同的物件),但同時取得直接指標參照 (由部分核心程式碼) 時,參照次數會增加;因此,核心物件的生命週期可能比建立此物件的程式碼生命週期長。系統也會保留參照物件的使用中控點數量,讓核心在物件的處理量達到零時觸發特定行為,即使核心因直接指標參照導致物件在背景保持運作也一樣。

在以下三個情況中,當核心物件沒有待處理的控制代碼時,核心物件會保持運作:

  • 物件是由訊息中的控制代碼參照,但尚未使用。這種情況可以透過管道 API 進行。儘管這類控制代碼在發布管道中,但核心可讓物件保持運作,主動處理的處理常式數量不為零。

  • 該物件是其他仍有中物件的父項。以連結至執行中 VMARVMO 為例,也就是有執行中程序或子工作且具有即時執行緒工作的程序。

  • 執行緒會讓執行緒保持運作。使用中的執行緒會繼續運作,直到呼叫 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_closezx_handle_close_many 關閉物件的最終控制代碼時,可保證物件的對等點 (如有) 將進入 PEER_CLOSED 狀態,並在 zx_handle_close 系統呼叫從核心傳回之前,在程序中聲明相關聯的訊號。

請注意,當對等互連的有效處理量達到 0 時,物件會放在 PEER_CLOSED 中,即使對等互連物件因核心保留的直接指標參照而持續運作也一樣。

核心物件安全性

核心物件沒有安全性的固有概念,且不會進行授權檢查;安全性權利由各個控點所持有。單一程序可以有兩個不同控制點給同一個物件,但擁有不同權限。

另請參閱

使用者名稱