摘要
新增記憶體對應。
宣告
#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_OVERWRITE
與ZX_VM_SPECIFIC
相同,但可以 與其他對應關係即使與其他 VMAR 部分重疊,也還是發生錯誤。 如果範圍符合這些要求,系統會採用不可分割的形式 (與所有 其他地圖/解除地圖/保護作業) 取代範圍中現有的對應 vmar_offset 和 len 指定。如果這個範圍有部分重疊 系統會繼續繪製這些對應範圍之外的部分。ZX_VM_OFFSET_IS_UPPER_LIMIT
將 vmar_offset 解讀為上限 限制由核心的偏移選項;如果 handle 則為無效 沒有ZX_VM_CAN_MAP_SPECIFIC
權限。最終的對應關係 的偏移量 + len 會小於 vmar_offset。這個選項不得為 如果使用ZX_VM_SPECIFIC
或ZX_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_WRITE
,vmo 處理常式沒有ZX_RIGHT_WRITE
右側,或是 options 未指定ZX_VM_PERM_READ
。ZX_VM_PERM_EXECUTE
將 vmo 對應為執行檔。如果處理常式是錯誤, 沒有ZX_VM_CAN_MAP_EXECUTE
權限,帳號代碼可以 沒有ZX_RIGHT_EXECUTE
,vmo 處理常式沒有ZX_RIGHT_EXECUTE
右側,或是 options 未指定ZX_VM_PERM_READ
。ZX_VM_MAP_RANGE
立即分頁到新對應的新對應中 建立在 VM 中的區域如果 使用的是ZX_VM_SPECIFIC_OVERWRITE
。ZX_VM_ALLOW_FAULTS
如果建立項目可能有可行性,則為必要欄位 來產生錯誤特別是如果 vmo 可調整大小,則必須提供此資訊。 如果 vmo 無法調整大小,但對應超過 vmo 的結尾,請 vmo 或 vmo 的建立來源為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_OVERWRITE
或ZX_VM_OFFSET_IS_UPPER_LIMIT
。
ZX_VM_OFFSET_IS_UPPER_LIMIT
用於限制選取範圍。
否則的行為會與 ZX_VM_SPECIFIC
和
ZX_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
handle 或 vmo 不是有效的帳號代碼。
ZX_ERR_WRONG_TYPE
帳號代碼或 vmo 並不是 VMAR 或 VMO 控制代碼。
ZX_ERR_BAD_STATE
帳號代碼是指已刪除的 VMAR。
ZX_ERR_INVALID_ARGS
適用於下列任一項目:
- mapped_addr 或 options 無效。
- vmar_offset如果 ZX_VM_SPECIFIC
、ZX_VM_SPECIFIC_OVERWRITE
或
已指定 ZX_VM_OFFSET_IS_UPPER_LIMIT
。
- ZX_VM_SPECIFIC_OVERWRITE
和 ZX_VM_MAP_RANGE
皆已指定。
- ZX_VM_OFFSET_IS_UPPER_LIMIT
與 ZX_VM_SPECIFIC
同時指定
或 ZX_VM_SPECIFIC_OVERWRITE
。
- vmar_offset 和 len 說明由於超過區域邊界而導致的分配情形有誤。
- vmar_offset 或 vmo_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_SMALL
VMO 無法調整大小,且對應內容延伸到結束為止
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