摘要
對應附加至 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 無效。- 如未指定 ZX_VM_SPECIFIC
、ZX_VM_SPECIFIC_OVERWRITE
或 ZX_VM_OFFSET_IS_UPPER_LIMIT
,vmar_offset 就不是零。- 同時指定 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
:如果區域可調整大小、可捨棄或由 Pager 支援,但未設定 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
。區域的存取規範可能會按照科目規格修改或限制這些作業。