zx_vmar_map_iob

摘要

對應附加至 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_mapoptions 參數

vmar_offset 等同於 zx_vmar_mapvmar_offset 參數。

ep 是端點,其中包含了在 zx_iob_create 中建立的區域。

region_index 是要對應的記憶體區域索引。

region_offset 等同於 zx_vmar_mapvmo_offset 參數。

region_len 相當於 zx_vmar_maplen 參數。不得為零且與頁面對齊

傳回值

zx_vmar_map_iob() 會在成功時傳回 ZX_OK 和對應的絕對基本地址 (透過 addr_out)。基本地址將以頁面對齊,而非零。如果失敗,系統會傳回負值錯誤值。

錯誤

ZX_ERR_BAD_HANDLE handleiob_ep 不是有效的控制代碼。

ZX_ERR_WRONG_TYPE handleiob_ep 並非 VMAR 或 IOB 控制代碼。

ZX_ERR_BAD_STATE「控制代碼」是指遭到刪除的 VMAR。

以下任一項目的 ZX_ERR_INVALID_ARGS: - mapped_addroptions 無效。- 如未指定 ZX_VM_SPECIFICZX_VM_SPECIFIC_OVERWRITEZX_VM_OFFSET_IS_UPPER_LIMITvmar_offset 就不是零。- 同時指定 ZX_VM_SPECIFIC_OVERWRITEZX_VM_MAP_RANGE。 - ZX_VM_OFFSET_IS_UPPER_LIMIT 會和 ZX_VM_SPECIFICZX_VM_SPECIFIC_OVERWRITE 一起指定。- vmar_offsetlen 說明超過區域邊界造成的配置情形不令人滿意。 - vmar_offsetregion_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_protectzx_vmar_op_rangezx_vmar_destroy。區域的存取規範可能會按照科目規格修改或限制這些作業。

另請參閱