zx_vmar_assign

摘要

分配新的子區域。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_vmar_allocate(zx_handle_t parent_vmar,
                             zx_vm_option_t options,
                             size_t offset,
                             size_t size,
                             zx_handle_t* child_vmar,
                             zx_vaddr_t* child_addr);

說明

parent_vmar 指定的範圍內建立新的 VMAR。

options 是位元向量,包含下列一或多個項目:

  • ZX_VM_COMPACT 向核心指示,在新建的子區域中配置和對應應保持近距離。請參閱下方的「NOTES」一節來討論。
  • ZX_VM_SPECIFIC 請使用 offset 來放置對應;如果 parent_vmar 沒有 ZX_VM_CAN_MAP_SPECIFIC 權限,則使用無效設定。offset 是相對於父項區域基本地址的偏移量。指定與其他 VMAR 或對應重疊的位址範圍將會導致錯誤。
  • ZX_VM_OFFSET_IS_UPPER_LIMIT偏移 解讀為上限,以限制核心選取偏移量,如果 parent_vmar 沒有 ZX_VM_CAN_MAP_SPECIFIC 權限,則無效。產生的對應會有偏移值 + size 為 <= offset。如果使用 ZX_VM_SPECIFIC,則無法指定這個選項。
  • ZX_VM_CAN_MAP_SPECIFIC 新的 VMAR 可使用 ZX_VM_SPECIFIC 建立子區域/對應。如果父項沒有 ZX_VM_CAN_MAP_SPECIFIC 權限,則「並非」錯誤。
  • ZX_VM_CAN_MAP_READ新的 VMAR 可包含可讀取的對應關係。如果上層沒有 ZX_VM_CAN_MAP_READ 權限,則會導致錯誤。
  • ZX_VM_CAN_MAP_WRITE新的 VMAR 可包含可寫入的對應關係。如果上層沒有 ZX_VM_CAN_MAP_WRITE 權限,則會導致錯誤。
  • ZX_VM_CAN_MAP_EXECUTE新的 VMAR 可包含可執行的對應。如果上層沒有 ZX_VM_CAN_MAP_EXECUTE 權限,則會導致錯誤。

如果 options 未設定 ZX_VM_SPECIFICZX_VM_OFFSET_IS_UPPER_LIMIToffset 必須為 0。

此外,還可以新增以下二次方對齊旗標:

  • ZX_VM_ALIGN_1KB 會將 child_addr 的值調整為 2 的次方至少 1,000 個位元組。
  • ZX_VM_ALIGN_2KB 會將 child_addr 的乘冪調整為至少 2,000 個位元組。
  • ZX_VM_ALIGN_4KB 會將 child_addr 調整為 2 的次方,至少為 4K 個位元組。
  • ZX_VM_ALIGN_8KB 會將 child_addr 的值調整為 8 千位元組的 2 乘冪。

直到

  • ZX_VM_ALIGN_4GB 會將 child_addr 調整為 2 號至少 4G 位元組。

如果 parent_vmar 基本地址 + offset 不符合要求的值,則搭配 ZX_VM_SPECIFIC 使用 ZX_VM_ALIGN 標記時會失敗。

權限

如果 optionsZX_VM_CAN_MAP_READparent_vmar 必須是 ZX_OBJ_TYPE_VMAR 類型,且具有 ZX_RIGHT_READ

如果 optionsZX_VM_CAN_MAP_WRITEparent_vmar 必須是 ZX_OBJ_TYPE_VMAR 類型,且具有 ZX_RIGHT_WRITE

如果 optionsZX_VM_CAN_MAP_EXECUTEparent_vmar 必須是 ZX_OBJ_TYPE_VMAR 類型,且具有 ZX_RIGHT_EXECUTE

傳回值

zx_vmar_allocate() 會傳回 ZX_OK、子區域的絕對基本位址 (透過 child_addr),並在成功時傳回新子區域的控制代碼 (透過 child_vmar)。基本地址將以頁面對齊,且不為零。如果失敗,系統會傳回負值錯誤值。

錯誤

ZX_ERR_BAD_HANDLE parent_vmar 不是有效的帳號代碼。

ZX_ERR_WRONG_TYPE parent_vmar 並非 VMAR 控制代碼。

ZX_ERR_BAD_STATE parent_vmar 是指遭到刪除的 VMAR。

以下任一項目的 ZX_ERR_INVALID_ARGS: - child_vmarchild_addr 無效,- 如未提供 ZX_VM_SPECIFICZX_VM_OFFSET_IS_UPPER_LIMIToffset 並非零。- ZX_VM_OFFSET_IS_UPPER_LIMITZX_VM_SPECIFIC 一起指定。- offsetsize 說明因超過區域邊界而導致無法滿足的配置 - offsetsize 未對齊頁面,或 size 為 0。

ZX_ERR_NO_MEMORY可能原因如下:

  • parent_vmar 中不提供要求大小的免費位址範圍。
  • 系統記憶體資源不足。

ZX_ERR_ACCESS_DENIED 您的權限不足,無法執行要求的分配作業。

附註

經銷商據點

VMAR 佔用的位址空間將保持分配 (在其父項 VMAR 中),直到呼叫 zx_vmar_destroy() 刪除 VMAR 為止。

請注意,只是關閉 VMAR 的控制代碼並不會取消分配 VMAR 佔用的位址空間。

COMPACT 旗標

核心會將這個標記解讀為要求,以減少配置中的支出。雖然這不需要降低分配位址的絕對熵,但分配作業之間的關聯可能極高。此情況可做出取捨,如果開發人員願意讓某些地址更具關聯性,開發人員可以盡量增加配置位置並減少所需的頁面資料表數量。

另請參閱