摘要
分配新的子區域。
宣告
#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_READ
、parent_vmar 必須是 ZX_OBJ_TYPE_VMAR
類型,且包含 ZX_RIGHT_READ
。
如果出現選項:ZX_VM_CAN_MAP_WRITE
、parent_vmar 必須是 ZX_OBJ_TYPE_VMAR
類型,且包含 ZX_RIGHT_WRITE
。
如果出現選項:ZX_VM_CAN_MAP_EXECUTE
、parent_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_vmar 或 child_addr 無效。
- 如未提供 ZX_VM_SPECIFIC
或 ZX_VM_OFFSET_IS_UPPER_LIMIT
,偏移為非零。
- ZX_VM_OFFSET_IS_UPPER_LIMIT
與 ZX_VM_SPECIFIC
同時指定。
- offset 和 size 表示超過區域邊界導致的無法配置
- offset 或 size 未與頁面對齊,或 size 為 0。
ZX_ERR_NO_MEMORY
可能的原因如下:
- 不提供所要求大小的任意位址範圍 parent_vmar。
- 系統的記憶體資源不足。
ZX_ERR_ACCESS_DENIED
權限不足,無法執行要求的分配作業。
附註
Deallocation
VMAR 佔用的位址空間將持續分配 (在其
父項 VMAR),直到呼叫 zx_vmar_destroy()
刪除 VMAR 為止。
請注意,只是關閉 VMAR 的控制代碼,並不會取消分配位址 減少了 VMAR 佔用空間
COMPACT 旗標
核心會將此標記解讀為減少分配量的請求。 雖然這不一定會減少分配到的 這些配置之間的關聯性可能會非常高 這是一種權衡取捨,開發人員可以為了 分配及減少必要的頁面表格數量 (如果他們願意的話) 讓特定地址更貼近您的需求