摘要
對應附加至 IOBuffer 的記憶體區域。這場通話有
類似於 zx_vmar_map
,但對應部分區域子集
不支援。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_vmar_map_iob(zx_handle_t handle,
zx_vm_option_t options,
size_t vmar_offset,
zx_handle_t iob_ep,
uint32_t region_index,
size_t region_len,
zx_vaddr_t* addr_out);
說明
將指定的 IOBuffer 區域對應至指定的虛擬記憶體 位址區域對應區域會保留對對應資料的參照 這代表關閉對應區域的端點 移除此函式新增的對應。
options 等同於 zx_vmar_map
的 options 參數
vmar_offset 等同於 zx_vmar_map
的 vmar_offset 參數。
ep 是端點,其中包含要對應的區域,如建立
zx_iob_create
。
region_index 是要對應的記憶體區域索引。
region_offset 等同於 zx_vmar_map
的 vmo_offset 參數。
region_len 等同於 zx_vmar_map
的 len 參數。這項服務
不得為零且頁面對齊
傳回值
zx_vmar_map_iob()
會傳回 ZX_OK
,以及
繪製地圖 (透過 addr_out)基本地址會以頁面對齊
和非零如果失敗,系統會傳回負的錯誤值。
錯誤
ZX_ERR_BAD_HANDLE
handle 或 iob_ep 不是有效的帳號代碼。
ZX_ERR_WRONG_TYPE
handle 或 iob_ep 分別不是 VMAR 或 IOB 控制代碼。
ZX_ERR_BAD_STATE
帳號代碼是指已刪除的 VMAR。
ZX_ERR_INVALID_ARGS
適用於下列任一項目:
- mapped_addr 或 options 無效。
- vmar_offset如果 ZX_VM_SPECIFIC
、ZX_VM_SPECIFIC_OVERWRITE
或
已指定 ZX_VM_OFFSET_IS_UPPER_LIMIT
。
- ZX_VM_SPECIFIC_OVERWRITE
和 ZX_VM_MAP_RANGE
皆已指定。
- ZX_VM_OFFSET_IS_UPPER_LIMIT
與 ZX_VM_SPECIFIC
同時指定
或 ZX_VM_SPECIFIC_OVERWRITE
。
- vmar_offset 和 len 說明由於超過區域邊界而導致的分配情形有誤。
- vmar_offset 或 region_offset 未對齊頁面。
- region_len 等於 0 或網頁未對齊。
ZX_ERR_ALREADY_EXISTS
ZX_VM_SPECIFIC
已指定但沒有
ZX_VM_SPECIFIC_OVERWRITE
,要求的範圍與其他對應重疊。
ZX_ERR_NO_RESOURCES
如果在 VMAR 中找不到某個點來建立對應。
ZX_ERR_ACCESS_DENIED
權限不足,無法進行要求的對應。
ZX_ERR_NOT_SUPPORTED
如果區域可調整大小、捨棄,或是由分頁器支援,
未設定ZX_VM_ALLOW_FAULTS
。
ZX_ERR_BUFFER_TOO_SMALL
,您無法調整區域大小,且對應內容延伸到結束為止
但 ZX_VM_ALLOW_FAULTS
並未設定
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。
使用者空間無法妥善處理這種 (異常) 錯誤。
在日後的版本中不會再發生這個錯誤。
ZX_ERR_OUT_OF_RANGE
適用於下列任一項目:
- region_offset + ROUNDUP(len, PAGE_SIZE)
溢位。
- region_index 不適用於所提供的 IOB
附註
VMAR 作業
對應區域通常支援 VMAR 作業,例如 zx_vmar_protect
。
zx_vmar_op_range
,zx_vmar_destroy
。一個區域的存取準則可能會
或限制這類作業