Zircon 是物件型核心,使用者模式程式碼幾乎只會透過物件句柄與 OS 資源互動。您可以將句柄視為活動工作階段,並將特定 OS 子系統的範圍限制為特定資源。
Zircon 會主動管理下列資源:
- 處理器時間
- 記憶體和位址空間
- device-io memory
- 中斷
- 訊號和等待
- 處理序間通訊
應用程式的核心物件
一般
處理序間通訊 (IPC)
Tasks
時段設定
訊號
記憶體和位址空間
等待中
驅動程式的核心物件
核心物件生命週期
核心物件會計算參照計數。大部分的核心物件是在「create」系統呼叫期間建立,並由第一個句柄保持運作,該句柄是 create 系統呼叫的輸出內容。呼叫端會取得句柄的數字 ID,而句柄本身會放置於程序的句柄表格中。
只要句柄位於句柄表中,系統就會保留句柄。您可以透過下列方式,從句柄表中移除句柄:
透過
zx_handle_close
關閉這些物件,這會遞減相應核心物件的參照計數。通常,當最後一個句柄關閉時,核心物件參照計數會達到 0,導致核心物件遭到銷毀。當持有含有句柄的未讀訊息的管道端點遭到銷毀時,所有待處理的訊息也會一併銷毀,並關閉訊息中含有的任何句柄。
擁有句柄資料表的程序遭到刪除時。核心會有效地逐一遍歷整個句柄資料表,並依序關閉每個句柄。
透過 zx_handle_duplicate
建立新的句柄 (參照相同物件) 時,參照計數會增加,但在取得直接指標參照 (由某些核心程式碼取得) 時也會增加;因此,核心物件的生命週期可能會比建立該物件的程式碼生命週期長。系統也會維護參照物件的有效句柄個別計數,讓核心在物件的句柄計數達到零時觸發特定行為,即使核心因直接指標參照而讓物件在幕後保持運作也一樣。
在以下三種情況下,即使沒有未結的句柄,核心物件仍會保持運作:
未使用的訊息中,有一個句柄參照了該物件。這可以透過管道 API 完成。當此句柄位於管道中時,核心會讓物件保持運作,並且具有非零的有效句柄計數。
該物件是另一個運作中的物件的父項。這是指已連結至實際 VMAR 的 VMOs、含有實際 執行緒 的程序,以及含有實際程序或子項工作的工作。
執行緒會由排程器維持運作。處於運作狀態的執行緒會持續運作,直到透過呼叫
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_close
或 zx_handle_close_many
關閉時,系統會保證物件的同級 (如有) 會置於 PEER_CLOSED
狀態,在 zx_handle_close
系統呼叫從核心傳回之前,在程序中斷言其相關聯信號。
請注意,當同伴的有效句柄計數降至零時,系統會將物件放入 PEER_CLOSED
,即使同伴物件因核心持有的直接指標參照而持續存在也是如此。
核心物件安全性
核心物件沒有內在的安全性概念,也不會進行授權檢查;安全性權利由每個句柄保留。單一程序可對同一個物件擁有兩個不同的句柄,且權限不同。