RFC-0253:zx_object_get_info ZX_INFO_VMAR_MAPS

RFC-0253:zx_object_get_info ZX_INFO_VMAR_MAPS
狀態已接受
區域
  • 核心
說明

這份 RFC 建議新增 zx_object_get_info 主題 ZX_INFO_VMAR_MAPS。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2024-07-19
審查日期 (年-月-日)2024-07-17

問題陳述

如果呼叫端只關心一個 VMAR,ZX_INFO_PROCESS_MAPS 就會效率不彰。

ZX_INFO_PROCESS_MAPS 會對程序的位址空間進行疊代,為呼叫端提供 zx_info_maps_t 結構體,說明每個位址區域和可供程序使用的對應項目。如果呼叫端只需要這項資訊的一部分,例如特定 VMAR 的內容,仍須支付全額費用。更糟的是,呼叫端必須篩選結果。

摘要

我們建議新增 object_info 主題 ZX_INFO_VMAR_MAPS,其行為類似 ZX_INFO_PROCESS_MAPS,但適用於 VMAR。

相關人員

誰會受到這項 RFC 是否通過的影響?(此為選用部分,但建議您填寫)。

協助人員:

審查者:adamperry@ (Starnix)、adanis@ (Zircon VM)、dworsham@ (Zircon VM)、mcgrathr@ (Zircon)

社會化:在起草此 RFC 前,我們曾與 adamperry@ 和 adanis@ 簡短討論過這項提案。

需求條件

本提案的目的,是讓 Starnix 能夠查詢特定 VMAR (Linux 程序位址空間,又稱為受限制區域),而非整個程序的位址空間,藉此提升 Starnix 效能。

效率:新系統呼叫應以指定 VMAR 的大小/複雜度為比例,執行工作。

對稱性和人體工學:新呼叫產生的結果,應在結構上與現有 ZX_INFO_PROCESS_MAPS 產生的結果相似,以便盡量減少想使用新呼叫的現有呼叫端的工作量。

設計

我們將新增名為 ZX_INFO_VMAR_MAPS 的新 object_info 主題。這個新主題的運作方式與現有的 ZX_INFO_PROCESS_MAPS 相同,但不會傳回指定程序的結果,而是傳回指定 VMAR 的結果。

ZX_INFO_PROCESS_MAPS 一樣,結果會是深度優先預先順序的遍歷。

第一筆結果記錄會說明指定的 VMAR。

ZX_INFO_PROCESS_MAPS 不同,結果的深度欄位會相對於指定的 VMAR,而非指定的程序。第一筆結果記錄的深度為 0。

舉例來說,object_get_info 的更新說明文件會說明以下內容:

If *topic* is `ZX_INFO_VMAR_MAPS`, *handle* must be of type `ZX_OBJ_TYPE_VMAR`
and have `ZX_RIGHT_INSPECT`.

### ZX_INFO_VMAR_MAPS

*handle* type: `VM Address Region`, with `ZX_RIGHT_INSPECT`

*buffer* type: `zx_info_maps_t[n]`

The `zx_info_maps_t` array is a depth-first pre-order walk of the target
VMAR tree. As per the pre-order traversal base addresses will be in ascending
order.

See `ZX_INFO_PROCESS_MAPS` for a description of `zx_info_maps_t`.

The first `zx_info_maps_t` will describe the queried VMAR. The *depth*
field of each entry describes its relationship to the nodes that come
before it. The queried VMAR will have depth 0. All other entries have
depth 1 or greater.

Additional errors:

*   `ZX_ERR_ACCESS_DENIED`: If the appropriate rights are missing.
*   `ZX_ERR_BAD_STATE`: If the target process containing the VMAR has
    terminated, or if the address space containing the VMAR has been
    destroyed.

實作

這項新功能將透過一系列小型且回溯相容的變更 (包括測試和說明文件的更新) 實作。部分現有程式碼會重構,以便同時用於 ZX_INFO_PROCESS_MAPSZX_INFO_VMAR_MAPS

成效

不會影響現有的程式碼/系統。完成後,從 ZX_INFO_PROCESS_MAPS 遷移至 ZX_INFO_VMAR_MAPS 的呼叫端應可見效能提升,因為系統會減少系統呼叫執行的工作,並消除任何呼叫後篩選步驟。

人體工學

為方便使用,結果類型和語意會與現有呼叫 object_get_infoZX_INFO_PROCESS_MAPS 的類型和語意相近。

回溯相容性

建議的變更可回溯相容。現有通話不會受到影響。新通話的行為類似於現有通話。

安全性考量

由於傳回的資訊是 ZX_INFO_PROCESS_MAPS 傳回的子集,且新的 object_get_info 呼叫需要與現有 ZX_INFO_PROCESS_MAPS 呼叫相同的句柄權限,因此安全性途徑或狀態不會有所變更。

隱私權注意事項

沒有隱私權疑慮。

測試

核心測試套件會更新,以便測試新的呼叫。

說明文件

系統會更新系統呼叫文件,說明新的呼叫。

缺點、替代方案和未知事項

實作這項提案只需要少量工程資源。新系統呼叫的未來維護工作應盡量減少。此外,新呼叫不會大幅降低 (核心實作) 彈性或 (API) 自由。

實作新主題的主要替代做法,就是繼續使用效率較低的 ZX_INFO_PROCESS_MAPS,並繼續篩選結果。

相對於目標和位址空間的深度

根據這項提案,系統會針對每個造訪節點回報的深度欄位,相對於指定的 VMAR 目標,從零開始。

另一種做法是回報相對於程序位址空間的深度。也就是回報絕對深度。這兩個選項都符合要求,且在達成目標方面表現相似。

我們選擇以目標為依據的深度,是因為這樣可向呼叫端公開的資訊較少,且在內部鎖定策略方面,也能提供更靈活的實作方式。

既有技術與參考資料

另請參閱 ZX_INFO_PROCESS_MAPSZX_INFO_VMAR