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 指定的 VM 中建立新的 VMAR。

options 是位元向量,包含下列另外一項:

  • ZX_VM_COMPACT 提示配置和對應的核心 新建的子區域內應保持一致詳情請參閱 下方的「NOTES」一節。
  • ZX_VM_SPECIFIC 使用偏移放置對應;如果 parent_vmar 沒有 ZX_VM_CAN_MAP_SPECIFIC 權限。偏移 是相對於父項區域基本位址的偏移值。發生錯誤 可指定與其他 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 權限,則視為錯誤。

如果選項沒有 ZX_VM_SPECIFIC,則 offset 必須為 0 或 已設定ZX_VM_OFFSET_IS_UPPER_LIMIT

此外,還可以新增下列兩個對齊旗標:

  • ZX_VM_ALIGN_1KB 會將 child_addr 對齊至少 1 千位元組的 power-2。
  • ZX_VM_ALIGN_2KB 會將 child_addr 對齊至少 2,000 個位元組。
  • ZX_VM_ALIGN_4KB 會將 child_addr 對齊至少 4K 位元組的 power-2。
  • ZX_VM_ALIGN_8KB 會將 child_addr 對齊至少 8,000 個位元組的 power-2。

最終持續到

  • ZX_VM_ALIGN_4GB 會將 child_addr 對齊至少 4G 位元組的 power-2。

搭配 ZX_VM_SPECIFIC 使用 ZX_VM_ALIGN 標記會在 parent_vmar 基準地址 + offset 與要求的資訊不一致 值。

權限

如果出現選項ZX_VM_CAN_MAP_READparent_vmar 必須是 ZX_OBJ_TYPE_VMAR 類型,且包含 ZX_RIGHT_READ

如果出現選項ZX_VM_CAN_MAP_WRITEparent_vmar 必須是 ZX_OBJ_TYPE_VMAR 類型,且包含 ZX_RIGHT_WRITE

如果出現選項ZX_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_LIMIT偏移為非零。 - ZX_VM_OFFSET_IS_UPPER_LIMITZX_VM_SPECIFIC 同時指定。 - offsetsize 表示超過區域邊界導致的無法配置 - offsetsize 未與頁面對齊,或 size 為 0。

ZX_ERR_NO_MEMORY可能的原因如下:

  • 不提供所要求大小的任意位址範圍 parent_vmar
  • 系統的記憶體資源不足。

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

附註

Deallocation

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

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

COMPACT 旗標

核心會將此標記解讀為減少分配量的請求。 雖然這不一定會減少分配到的 這些配置之間的關聯性可能會非常高 這是一種權衡取捨,開發人員可以為了 分配及減少必要的頁面表格數量 (如果他們願意的話) 讓特定地址更貼近您的需求

另請參閱