Zx_bti_pin

摘要

固定頁面並授權裝置存取。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_bti_pin(zx_handle_t handle,
                       uint32_t options,
                       zx_handle_t vmo,
                       uint64_t offset,
                       uint64_t size,
                       zx_paddr_t* addrs,
                       size_t num_addrs,
                       zx_handle_t* pmt);

說明

zx_bti_pin() 會固定 VMO 的頁面 (即防止這類頁面遭停用) 透過 zx_vmo_op_range()),並授予 BTI 可存取這些網頁的功能所代表的交易 ID。 具備「選項」中指定的權限。

offset 必須與頁面邊界對齊。

options 是位元欄位,可能包含一或多個 ZX_BTI_PERM_READZX_BTI_PERM_WRITEZX_BTI_PERM_EXECUTEZX_BTI_COMPRESSZX_BTI_CONTIGUOUS。為了讓呼叫成功,vmo 必須具備 與選項中設定的權限標記相對應的 READ/WRITE 權限。 (注意:ZX_BTI_PERM_EXECUTE 需要 ZX_RIGHT_READ,而非 ZX_RIGHT_EXECUTE)。 只有當 vmo 是透過下列方式分配時,才能使用 ZX_BTI_CONTIGUOUS zx_vmo_create_contiguous()zx_vmo_create_physical()ZX_BTI_COMPRESSZX_BTI_CONTIGUOUS 互斥,

如果 offsetsize 指定的 vmo 範圍包含未修訂 網頁,只要成功叫用此函式,將會產生這些網頁 失敗時,表示工作是否已 。

addrs 將填入所要求裝置的實際位址 VMO 頁面。這些位址可能會提供給發出記憶體的裝置 與 BTI 關聯的硬體交易 ID 進行的交易。 傳回的地址數量取決於 ZX_BTI_COMPRESS 或 已提供 ZX_BTI_CONTIGUOUS 個選項。地址數量會是 1 這三種可能性:

  1. 如果兩者皆未設定,每頁 (size / PAGE_SIZE) 各有一個。
  2. 如果設定了 ZX_BTI_COMPRESS,則 size / minimum-contiguity,會無條件進位 (每個位址代表一次執行最小連續位元組, 如果 size 不是 「最小連續性」)。確保所有傳回的地址均 以最小連續性為準。請注意,可以找到最小連續性 透過 zx_object_get_info()
  3. 如果設定了 ZX_BTI_CONTIGUOUS,表示記憶體啟動的單一位址。

num_addrsaddrs 陣列中的項目數。該欄位為 num_addrs 與上述值不相符。

PMT 會保留對相關聯 VMO 的參照,因此基礎 VMO 不會 刪除,直到 PMT 取消固定為止。

可固定可調整大小的 VMO。如果呼叫 zx_vmo_set_size() 會捨棄 固定頁面,這樣呼叫就會失敗

選項

  • ZX_BTI_PERM_READZX_BTI_PERM_WRITEZX_BTI_PERM_EXECUTE 會定義 硬體匯流排交易發起者將允許的存取權類型 。
  • ZX_BTI_COMPRESS 會使傳回的地址清單中的每個項目包含一個項目 區塊的「最小連續」位元組,而非每 PAGE_SIZE 一個。

權限

handle 必須是 ZX_OBJ_TYPE_BTI 類型,且包含 ZX_RIGHT_MAP

vmo 必須是 ZX_OBJ_TYPE_VMO 類型,且包含 ZX_RIGHT_MAP

如果出現選項ZX_BTI_PERM_READvmo 必須是 ZX_OBJ_TYPE_VMO 類型,且包含 ZX_RIGHT_READ

如果出現選項ZX_BTI_PERM_WRITEvmo 必須是 ZX_OBJ_TYPE_VMO 類型,且包含 ZX_RIGHT_WRITE

如果出現選項ZX_BTI_PERM_EXECUTEvmo 必須是 ZX_OBJ_TYPE_VMO 類型,且包含 ZX_RIGHT_READ

傳回值

成功時,zx_bti_pin() 會傳回 ZX_OK。裝置的實際位址 要求的 VMO 頁面會以 addrs 寫入。已建立「釘選」的控制代碼 記憶體權杖是透過 pmt 傳回。不再需要 PMT 時 應叫用 zx_pmt_unpin()

如果失敗,系統會傳回負的錯誤值。

錯誤

ZX_ERR_BAD_HANDLE handlevmo 不是有效的帳號代碼。

ZX_ERR_WRONG_TYPE 帳號代碼不是 BTI 帳號代碼,或 vmo 不是 VMO 控制代碼。

ZX_ERR_ACCESS_DENIED 帳號代碼vmo 沒有 ZX_RIGHT_MAP, 或 options 具有與 vmo 右側的權限標記相對應的權限標記 但實際上

ZX_ERR_INVALID_ARGS options 為 0 或包含未定義的標記,兩者皆可 addrspmt 不是有效的指標,num_addrs 和 預估傳回的項目數量,或不會傳回 offsetsize 對齊頁面。

ZX_ERR_OUT_OF_RANGE offset + size 超出 vmo 的範圍。

ZX_ERR_UNAVAILABLE (暫時) 在要求範圍內,有至少一個網頁 目前無法固定。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。無論如何 處理此 (異常) 錯誤。在日後的版本中,這項錯誤不會 才能避免這類問題再次發生

另請參閱