名稱
vm_address_region - 虛擬記憶體位址空間的連續區域
SYNOPSIS
虛擬記憶體位址地區 (VMAR) 代表虛擬容器的連續部分 位址空間。
說明
核心和使用者空間使用 VMAR,代表模型的分配 位址空間。
每個程序一開始都會先執行一個涵蓋整個整個 VM 的 VMAR (根 VMAR)
位址空間 (請參閱 zx_process_create()
)。每則 VMAR
可以按照邏輯分割成任意數量的非重疊部分
代表子項 VMAR、虛擬記憶體對應或缺口。兒童 VMAR
是使用 zx_vmar_allocate()
建立。VM 對應
是使用 zx_vmar_map()
建立。
VMAR 具備階層權限模型,可授予對應權限。 舉例來說,根 VMAR 允許讀取、寫入和可執行的對應。一 可能建立僅允許讀取及寫入對應關係的子項 VMAR。 建立允許可執行對應項目的子項是不合法的。
使用 zx_vmar_allocate()
建立 VMAR 時,其父項 VMAR 會保留參照
先前提過
執行個體對於分配到的外部 IP 位址一無所知因此,如果子項 VMAR 的所有控點都已關閉,子項 VMAR 就會關閉
及其子系會繼續在位址空間中運作。為了
中斷孩子與位址空間的連線 (zx_vmar_destroy()
)
必須在子項控制代碼上呼叫。
根據預設,位址空間的所有分配方式均是隨機進行。抵達警察 建立時間,呼叫端可以選擇要使用哪種隨機化演算法。 預設分配器會嘗試將配置分配給整個 VMAR 的寬度和高度已選取的替代分配器 ZX_VM_COMPACT,嘗試讓配置在 只不過是隨機排序的。建議使用 預設分配器
VMAR 會選擇性支援固定偏移對應模式 (稱為「特定對應」)。 這個模式可用於建立防護機制頁面,或確保 對應。每個 VMAR 都可能具有 ZX_VM_CAN_MAP_SPECIFIC 權限。 無論父項 VMAR 是否具備該權限
範例
#include <zircon/syscalls.h>
/* Map this VMO into the given VMAR, with |before| bytes of unmapped guard space
before it and |after| bytes after it. */
zx_status_t map_with_guard(zx_handle_t vmar, size_t before, size_t after,
zx_handle_t vmo, uint64_t vmo_offset,
size_t mapping_len, uintptr_t* mapped_addr,
zx_handle_t* wrapping_vmar) {
/* wrap around check elided */
const size_t child_vmar_size = before + after + mapping_len;
const zx_vm_option_t child_vmar_options = ZX_VM_CAN_MAP_READ |
ZX_VM_CAN_MAP_WRITE |
ZX_VM_CAN_MAP_SPECIFIC;
const zx_vm_option_t mapping_options = ZX_VM_SPECIFIC |
ZX_VM_PERM_READ |
ZX_VM_PERM_WRITE;
uintptr_t child_vmar_addr;
zx_handle_t child_vmar;
zx_status_t status = zx_vmar_allocate(vmar, child_vmar_options, 0,
child_vmar_size,
&child_vmar,
&child_vmar_addr);
if (status != ZX_OK) {
return status;
}
status = zx_vmar_map(child_vmar, mapping_options, before, vmo, vmo_offset,
mapping_len, mapped_addr);
if (status != ZX_OK) {
zx_vmar_destroy(child_vmar);
zx_handle_close(child_vmar);
return status;
}
*wrapping_vmar = child_vmar;
return ZX_OK;
}
查看其他建議
- vm_object - 虛擬記憶體物件
語音
zx_vmar_allocate()
- 建立新的子項 VMARzx_vmar_map()
:將 VMO 對應至程序zx_vmar_unmap()
- 從程序取消對應記憶體區域zx_vmar_protect()
- 調整記憶體存取權限zx_vmar_destroy()
- 刪除 VMAR 及其所有子項