虛擬記憶體位址區域

名稱

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;
}

查看其他建議

語音