Zircon 核心物件

Zircon 是物件型核心,使用者模式程式碼幾乎只會透過物件句柄與 OS 資源互動。您可以將句柄視為活動工作階段,並將特定 OS 子系統的範圍限制為特定資源。

Zircon 會主動管理下列資源:

  • 處理器時間
  • 記憶體和位址空間
  • device-io memory
  • 中斷
  • 訊號和等待
  • 處理序間通訊

應用程式的核心物件

一般

處理序間通訊 (IPC)

Tasks

時段設定

訊號

記憶體和位址空間

等待中

驅動程式的核心物件

核心物件生命週期

核心物件會計算參照計數。大部分的核心物件是在「create」系統呼叫期間建立,並由第一個句柄保持運作,該句柄是 create 系統呼叫的輸出內容。呼叫端會取得句柄的數字 ID,而句柄本身會放置於程序的句柄表格中。

只要句柄位於句柄表中,系統就會保留句柄。您可以透過下列方式,從句柄表中移除句柄:

  • 透過 zx_handle_close 關閉這些物件,這會遞減相應核心物件的參照計數。通常,當最後一個句柄關閉時,核心物件參照計數會達到 0,導致核心物件遭到銷毀。

  • 當持有含有句柄的未讀訊息的管道端點遭到銷毀時,所有待處理的訊息也會一併銷毀,並關閉訊息中含有的任何句柄。

  • 擁有句柄資料表的程序遭到刪除時。核心會有效地逐一遍歷整個句柄資料表,並依序關閉每個句柄。

透過 zx_handle_duplicate 建立新的句柄 (參照相同物件) 時,參照計數會增加,但在取得直接指標參照 (由某些核心程式碼取得) 時也會增加;因此,核心物件的生命週期可能會比建立該物件的程式碼生命週期長。系統也會維護參照物件的有效句柄個別計數,讓核心在物件的句柄計數達到零時觸發特定行為,即使核心因直接指標參照而讓物件在幕後保持運作也一樣。

在以下三種情況下,即使沒有未結的句柄,核心物件仍會保持運作:

  • 未使用的訊息中,有一個句柄參照了該物件。這可以透過管道 API 完成。當此句柄位於管道中時,核心會讓物件保持運作,並且具有非零的有效句柄計數。

  • 該物件是另一個運作中的物件的父項。這是指已連結至實際 VMARVMOs、含有實際 執行緒 的程序,以及含有實際程序或子項工作的工作

  • 執行緒會由排程器維持運作。處於運作狀態的執行緒會持續運作,直到透過呼叫 zx_thread_exit 自行退出,或是透過 zx_task_kill 終止程序為止。

最後一個案例的結果是,單一執行緒可以讓其程序和整個工作傳承 (直到根工作) 保持運作。

已配對的物件和已關閉的對等端狀態

目前,核心會將下列物件類型定義為「對等」物件。

名稱 對等端關閉的信號名稱
管道 ZX_CHANNEL_PEER_CLOSED
Socket ZX_SOCKET_PEER_CLOSED
FIFO 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 系統呼叫從核心傳回之前,在程序中斷言其相關聯信號。

請注意,當同伴的有效句柄計數降至零時,系統會將物件放入 PEER_CLOSED,即使同伴物件因核心持有的直接指標參照而持續存在也是如此。

核心物件安全性

核心物件沒有內在的安全性概念,也不會進行授權檢查;安全性權利由每個句柄保留。單一程序可對同一個物件擁有兩個不同的句柄,且權限不同。

另請參閱

使用者名稱