摘要
固定頁面並授權裝置存取。
宣告
#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_READ
。
ZX_BTI_PERM_WRITE
、ZX_BTI_PERM_EXECUTE
、ZX_BTI_COMPRESS
和
ZX_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_COMPRESS
和 ZX_BTI_CONTIGUOUS
互斥,
如果 offset 與 size 指定的 vmo 範圍包含未修訂 網頁,只要成功叫用此函式,將會產生這些網頁 失敗時,表示工作是否已 。
addrs 將填入所要求裝置的實際位址
VMO 頁面。這些位址可能會提供給發出記憶體的裝置
與 BTI 關聯的硬體交易 ID 進行的交易。
傳回的地址數量取決於 ZX_BTI_COMPRESS
或
已提供 ZX_BTI_CONTIGUOUS
個選項。地址數量會是 1
這三種可能性:
- 如果兩者皆未設定,每頁 (
size / PAGE_SIZE
) 各有一個。 - 如果設定了
ZX_BTI_COMPRESS
,則size / minimum-contiguity
,會無條件進位 (每個位址代表一次執行最小連續位元組, 如果 size 不是 「最小連續性」)。確保所有傳回的地址均 以最小連續性為準。請注意,可以找到最小連續性 透過zx_object_get_info()
。 - 如果設定了
ZX_BTI_CONTIGUOUS
,表示記憶體啟動的單一位址。
num_addrs 是 addrs 陣列中的項目數。該欄位為 num_addrs 與上述值不相符。
PMT 會保留對相關聯 VMO 的參照,因此基礎 VMO 不會 刪除,直到 PMT 取消固定為止。
可固定可調整大小的 VMO。如果呼叫 zx_vmo_set_size()
會捨棄
固定頁面,這樣呼叫就會失敗
選項
ZX_BTI_PERM_READ
、ZX_BTI_PERM_WRITE
和ZX_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_READ
,vmo 必須是 ZX_OBJ_TYPE_VMO
類型,且包含 ZX_RIGHT_READ
。
如果出現選項:ZX_BTI_PERM_WRITE
,vmo 必須是 ZX_OBJ_TYPE_VMO
類型,且包含 ZX_RIGHT_WRITE
。
如果出現選項:ZX_BTI_PERM_EXECUTE
,vmo 必須是 ZX_OBJ_TYPE_VMO
類型,且包含 ZX_RIGHT_READ
。
傳回值
成功時,zx_bti_pin()
會傳回 ZX_OK
。裝置的實際位址
要求的 VMO 頁面會以 addrs 寫入。已建立「釘選」的控制代碼
記憶體權杖是透過 pmt 傳回。不再需要 PMT 時
應叫用 zx_pmt_unpin()
。
如果失敗,系統會傳回負的錯誤值。
錯誤
ZX_ERR_BAD_HANDLE
handle 或 vmo 不是有效的帳號代碼。
ZX_ERR_WRONG_TYPE
帳號代碼不是 BTI 帳號代碼,或 vmo 不是 VMO
控制代碼。
ZX_ERR_ACCESS_DENIED
帳號代碼或 vmo 沒有 ZX_RIGHT_MAP
,
或 options 具有與 vmo 右側的權限標記相對應的權限標記
但實際上
ZX_ERR_INVALID_ARGS
options 為 0 或包含未定義的標記,兩者皆可
addrs 或 pmt 不是有效的指標,num_addrs 和
預估傳回的項目數量,或不會傳回 offset 或 size
對齊頁面。
ZX_ERR_OUT_OF_RANGE
offset + size
超出 vmo 的範圍。
ZX_ERR_UNAVAILABLE
(暫時) 在要求範圍內,有至少一個網頁
目前無法固定。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。無論如何
處理此 (異常) 錯誤。在日後的版本中,這項錯誤不會
才能避免這類問題再次發生