zx_vmar_map

摘要

新增記憶體對應。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_vmar_map(zx_handle_t handle,
                        zx_vm_option_t options,
                        size_t vmar_offset,
                        zx_handle_t vmo,
                        uint64_t vmo_offset,
                        size_t len,
                        zx_vaddr_t* mapped_addr);

說明

將指定的 VMO 對應至指定的虛擬記憶體位址區域。對應關係 會保留基礎虛擬記憶體物件的參照, 關閉 VMO 控制代碼並不會移除由這個函式新增的對應關係。

options 是下列項目的位元向量:

  • ZX_VM_SPECIFIC 使用 vmar_offset 來放置對應關係;如果 處理常式不具備 ZX_VM_CAN_MAP_SPECIFIC 權限。 vmar_offset 是相對於指定 VMAR 基本位址的偏移值。 指定與另一個 VMAR 或對應重疊的範圍會發生錯誤。
  • ZX_VM_SPECIFIC_OVERWRITEZX_VM_SPECIFIC 相同,但可以 與其他對應關係即使與其他 VMAR 部分重疊,也還是發生錯誤。 如果範圍符合這些要求,系統會採用不可分割的形式 (與所有 其他地圖/解除地圖/保護作業) 取代範圍中現有的對應 vmar_offsetlen 指定。如果這個範圍有部分重疊 系統會繼續繪製這些對應範圍之外的部分。
  • ZX_VM_OFFSET_IS_UPPER_LIMITvmar_offset 解讀為上限 限制由核心的偏移選項;如果 handle 則為無效 沒有 ZX_VM_CAN_MAP_SPECIFIC 權限。最終的對應關係 的偏移量 + len 會小於 vmar_offset。這個選項不得為 如果使用 ZX_VM_SPECIFICZX_VM_SPECIFIC_OVERWRITE,會指定這個值。
  • ZX_VM_PERM_READ 地圖中的「vmo」vmo易讀圖。如果處理常式是錯誤, 沒有 ZX_VM_CAN_MAP_READ 權限,帳號代碼可以 沒有 ZX_RIGHT_READ 正確,或 vmo 控制代碼沒有 右ZX_RIGHT_READ
  • ZX_VM_PERM_WRITE 對應 vmovmo 檔案。如果處理常式是錯誤, 沒有 ZX_VM_CAN_MAP_WRITE 權限,帳號代碼可以 沒有 ZX_RIGHT_WRITEvmo 處理常式沒有 ZX_RIGHT_WRITE右側,或是 options 未指定 ZX_VM_PERM_READ
  • ZX_VM_PERM_EXECUTEvmo 對應為執行檔。如果處理常式是錯誤, 沒有 ZX_VM_CAN_MAP_EXECUTE 權限,帳號代碼可以 沒有 ZX_RIGHT_EXECUTEvmo 處理常式沒有 ZX_RIGHT_EXECUTE右側,或是 options 未指定 ZX_VM_PERM_READ
  • ZX_VM_MAP_RANGE 立即分頁到新對應的新對應中 建立在 VM 中的區域如果 使用的是 ZX_VM_SPECIFIC_OVERWRITE
  • ZX_VM_ALLOW_FAULTS 如果建立項目可能有可行性,則為必要欄位 來產生錯誤特別是如果 vmo 可調整大小,則必須提供此資訊。 如果 vmo 無法調整大小,但對應超過 vmo 的結尾,請 vmovmo 的建立來源為 zx_pager_create_vmo()
  • ZX_VM_PERM_READ_IF_XOM_UNSUPPORTED地圖 vmo 的內容在系統成功時可讀 不支援只對應執行網頁。如果系統可以只對應執行 系統會忽略這個標記。
  • ZX_VM_REQUIRE_NON_RESIZABLE 如果 vmo 可調整大小,就會失敗。

如果 options 沒有 ZX_VM_SPECIFIC,則 vmar_offset 必須為 0。 已設定ZX_VM_SPECIFIC_OVERWRITEZX_VM_OFFSET_IS_UPPER_LIMITZX_VM_OFFSET_IS_UPPER_LIMIT 用於限制選取範圍。 否則的行為會與 ZX_VM_SPECIFICZX_VM_SPECIFIC_OVERWRITE 已設定,且對應正在指派偏移值 由核心隨機定義 (其中配置器是由 目標 VMAR)。

len 不得為零且頁面對齊。

此外,還可以新增下列其中一個次強大對齊旗標:

  • 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。

如果使用 vmar,將 ZX_VM_ALIGN 標記與 ZX_VM_SPECIFIC 搭配使用將會失敗 基準位址 + vmo_offset 與要求的值不相符。

權限

handle 必須是 ZX_OBJ_TYPE_VMAR 類型。

vmo 必須是 ZX_OBJ_TYPE_VMO 類型。

傳回值

zx_vmar_map() 會傳回 ZX_OK,以及 地圖 (透過 mapped_addr) 即可達成。基本地址會以頁面對齊 和非零如果失敗,系統會傳回負的錯誤值。

錯誤

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

ZX_ERR_WRONG_TYPE 帳號代碼vmo 並不是 VMAR 或 VMO 控制代碼。

ZX_ERR_BAD_STATE 帳號代碼是指已刪除的 VMAR。

ZX_ERR_INVALID_ARGS 適用於下列任一項目: - mapped_addroptions 無效。 - vmar_offset如果 ZX_VM_SPECIFICZX_VM_SPECIFIC_OVERWRITE 或 已指定 ZX_VM_OFFSET_IS_UPPER_LIMIT。 - ZX_VM_SPECIFIC_OVERWRITEZX_VM_MAP_RANGE 皆已指定。 - ZX_VM_OFFSET_IS_UPPER_LIMITZX_VM_SPECIFIC 同時指定 或 ZX_VM_SPECIFIC_OVERWRITE。 - vmar_offsetlen 說明由於超過區域邊界而導致的分配情形有誤。 - vmar_offsetvmo_offset 未對齊頁面。 - len 等於 0 或不與頁面對齊。

ZX_ERR_ALREADY_EXISTS ZX_VM_SPECIFIC 已指定但沒有 ZX_VM_SPECIFIC_OVERWRITE,要求的範圍與其他對應重疊。

ZX_ERR_NO_RESOURCES 如果在 VMAR 中找不到某個點來建立對應。

ZX_ERR_ACCESS_DENIED 權限不足,無法進行要求的對應。

ZX_ERR_NOT_SUPPORTED 如果 Vmo 可調整大小、可捨棄,或是由呼叫器支援 未設定ZX_VM_ALLOW_FAULTS

ZX_ERR_NOT_SUPPORTED 如果 Vmo 可調整大小,且已設定 ZX_VM_REQUIRE_NON_RESIZABLE

ZX_ERR_BUFFER_TOO_SMALLVMO 無法調整大小,且對應內容延伸到結束為止 VMO,但未設定 ZX_VM_ALLOW_FAULTS

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。 使用者空間無法妥善處理這種 (異常) 錯誤。 在日後的版本中不會再發生這個錯誤。

ZX_ERR_OUT_OF_RANGE vmo_offset + ROUNDUP(len, PAGE_SIZE) 溢位。

附註

備份記憶體對應的 VMO 可調整大小至較小的尺寸。造成 執行緒正在讀取或寫入 VMAR 區域以發生錯誤。為防範這類危害 從用戶端接收 VMO 時應使用 ZX_VM_REQUIRE_NON_RESIZABLE 對應 擔任 VMO

另請參閱