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 存取這些頁面的權限,且這些權限會在 options 中指定。

偏移值必須對齊頁面邊界。

options 是位元欄位,可能包含 ZX_BTI_PERM_READZX_BTI_PERM_WRITEZX_BTI_PERM_EXECUTEZX_BTI_COMPRESSZX_BTI_CONTIGUOUS 中的一或多個值。為了讓呼叫成功,vmo 必須具備「options」中設定的權限旗標對應的「READ/WRITE」權限。(注意:ZX_BTI_PERM_EXECUTE 需要 ZX_RIGHT_READ,而非 ZX_RIGHT_EXECUTE。) 只有在透過 zx_vmo_create_contiguous()zx_vmo_create_physical() 分配 vmo 時,才能使用 ZX_BTI_CONTIGUOUSZX_BTI_COMPRESSZX_BTI_CONTIGUOUS 互斥。

如果 vmo 中由 offsetsize 指定的範圍包含未提交的頁面,則成功叫用這個函式會導致這些頁面已提交。發生錯誤時,系統不會定義是否已提交。

addrs 會填入要求的 VMo 頁面裝置實體位址。這些位址可能會提供給使用 BTI 相關硬體交易 ID 發出記憶體交易的裝置。傳回的地址數量取決於是否提供 ZX_BTI_COMPRESSZX_BTI_CONTIGUOUS 選項。地址數量有三種可能:

  1. 如果未設定,則每頁一個 (size / PAGE_SIZE)。
  2. 如果已設定 ZX_BTI_COMPRESSsize / minimum-contiguity 會向上捨入 (每個位址代表一連串的 最小連續性位元組,如果大小不是 最小連續性的倍數,最後一個位元組可能會較短)。系統會保證所有傳回的地址都會以最小連續性對齊。請注意,minimum-contiguity 可透過 zx_object_get_info() 進行探索。
  3. 如果已設定 ZX_BTI_CONTIGUOUS,則為記憶體開頭的單一位址。

num_addrsaddrs 陣列中的項目數量。如果 num_addrs 與上述計算的值不符,則表示發生錯誤。

PMT 會保留關聯 VMO 的參照,因此在解除 PMT 固定之前,基礎 VMO 不會遭到銷毀。

可調整大小的 VMOs 可釘選。如果呼叫 zx_vmo_set_size() 會捨棄已固定的頁面,該呼叫就會失敗。

選項

  • ZX_BTI_PERM_READZX_BTI_PERM_WRITEZX_BTI_PERM_EXECUTE 會定義硬體匯流排交易啟動程序可使用的存取類型。
  • ZX_BTI_COMPRESS 會讓傳回的地址清單每個 minimum-contiguity 位元組區塊包含一個項目,而非每個 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。系統會在 addrs 中寫入要求的 VMO 頁面裝置實體位址。系統會透過 pmt 傳回已建立的固定記憶體權杖的句柄。當不再需要 PMT 時,應叫用 zx_pmt_unpin()

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

錯誤

ZX_ERR_BAD_HANDLE handlevmo 不是有效的 handle。

ZX_ERR_WRONG_TYPE handle 不是 BTI handle,或是 vmo 不是 VMO handle。

ZX_ERR_ACCESS_DENIED handlevmo 沒有 ZX_RIGHT_MAP,或是 options 包含權限標記,對應至 vmo 沒有的權利。

ZX_ERR_INVALID_ARGS options 為 0 或包含未定義的標記、addrspmt 不是有效的指標、num_addrs 與傳回的項目數量不符、num_addrs 過大或offsetsize 未對齊頁面。

ZX_ERR_OUT_OF_RANGE offset + size 超出 vmo 的範圍。

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

ZX_ERR_NO_MEMORY 記憶體不足導致失敗。使用者空間沒有適當的方式來處理這個 (不太可能發生的) 錯誤。日後的版本將不會再發生這個錯誤。

另請參閱