摘要
對應附加至 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 handle 是指已毀損的 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 一併指定。
- 已指定 ZX_VM_FAULT_BEYOND_STREAM_SIZE。
- 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。如要瞭解區域的存取規範是否會修改或限制這些作業,請參閱規範規格。