摘要
對各種呼叫器擁有的 VMO 執行特定作業。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_pager_op_range(zx_handle_t pager,
uint32_t op,
zx_handle_t pager_vmo,
uint64_t offset,
uint64_t length,
uint64_t data);
說明
執行由 op 指定、offset、offset 和 op 的呼叫器作業
length)。pager_vmo 必須事先透過 pager 建立,步驟如下:
zx_pager_create_vmo()。offset 和 length 必須對齊頁面。「data」是選用項目
參數 (如果指定的 op 支援的話)。
可執行的作業 (即 op 值可以):
ZX_PAGER_OP_DIRTY:使用者空間呼叫器想要轉換位於 [偏移] 範圍的頁面。
offset + length)。這項操作會解除封鎖
指定範圍的 ZX_PAGER_VMO_DIRTY 個網頁要求。
ZX_PAGER_OP_FAIL - userspace 呼叫器無法完成 pager_vmo 的
範圍 [偏移、偏移 + 長度),指令為 ZX_PAGER_VMO_READ 或 ZX_PAGER_VMO_DIRTY。
data 包含發生的錯誤 (zx_status_t 錯誤代碼已延伸至 uint64_t
值) - 允許的值為 ZX_ERR_IO、ZX_ERR_IO_DATA_INTEGRITY、ZX_ERR_BAD_STATE、
ZX_ERR_NO_SPACE 和 ZX_ERR_BUFFER_TOO_SMALL。
這樣一來,系統發現該範圍內可能正在等待網頁要求的執行緒,才會將執行緒解除封鎖。如果
封鎖的執行緒透過 zx_vmo_read() / zx_vmo_write() 或
zx_vmo_op_range() 搭配 ZX_VMO_OP_COMMIT,呼叫將會失敗,並顯示錯誤狀態 (資料)
。如果遭封鎖的執行緒透過 VMAR 對應要求網頁,執行緒就會
取得嚴重的頁面錯誤例外狀況
ZX_PAGER_OP_WRITEBACK_BEGIN:使用者空間網頁器想開始寫回範圍中的頁面
[offset、offset + length)。這表示意圖清除指定
寫入完成後的範圍 (帶有 ZX_PAGER_OP_WRITEBACK_END)。詳情請參閱
請參考下方程式碼範例,瞭解我們建議的用法。
您可以選擇將 data 設為 ZX_VMO_DIRTY_RANGE_IS_ZERO,表示呼叫端希望
將指定範圍傳回為零。這項功能的用途是在呼叫端處理期間使用
由 zx_pager_query_dirty_ranges() 傳回的範圍,其 options 設為
ZX_VMO_DIRTY_RANGE_IS_ZERO。可確保在該範圍中建立的任何非零內容
到寫入開始之前,並未遺失,因為錯誤假設
然後標示為乾淨 (所以可收回)。
ZX_PAGER_OP_WRITEBACK_END:使用者空間網頁器已將範圍中的頁面寫回範圍內
[offset、offset + length)。這會指出指定時間範圍內,
先前透過 ZX_PAGER_OP_WRITEBACK_BEGIN 發出信號可標示為清理。詳情請參閱
請參考下方程式碼範例,瞭解我們建議的用法。
這個核心可以隨意剔除任何已標示為乾淨的頁面或零範圍, userspace Pager 預計會在需要時再次提供。這也表示 任何刊登中的供品都應謹慎使用,並且只提供新的 當天才寫的內容
運用程式碼範例 (模數錯誤處理),找出並清除任何骯髒的網頁,看起來可能像這樣 而負責任的 AI 技術做法 有助於達成這項目標
zx_vmo_dirty_range_t ranges[kMaxRanges];
uint64_t num_ranges;
zx_status_t st =
zx_pager_query_dirty_ranges(pager, vmo, 0, vmo_size, &ranges[0],
kMaxRanges * sizeof(zx_vmo_dirty_range_t), &num_ranges, nullptr);
for (uint64_t i = 0; i < num_ranges; i++) {
uint64_t start = ranges[i].offset;
uint64_t len = ranges[i].length;
st = zx_pager_op_range(pager, ZX_PAGER_OP_WRITEBACK_BEGIN, vmo, start, len, 0);
WritebackToDisk(vmo, start, len);
st = zx_pager_op_range(pager, ZX_PAGER_OP_WRITEBACK_END, vmo, start, len, 0);
}
權限
pager 必須是 ZX_OBJ_TYPE_PAGER 類型,且具有 ZX_RIGHT_MANAGE_VMO。
pager_vmo 必須是 ZX_OBJ_TYPE_VMO 類型,且包含 ZX_RIGHT_WRITE。
傳回值
zx_pager_op_range() 會在成功時傳回 ZX_OK,否則會在失敗時傳回下列其中一個錯誤代碼。
錯誤
ZX_ERR_BAD_HANDLE pager 或 pager_vmo 不是有效的帳號代碼。
ZX_ERR_WRONG_TYPE pager 不是 Pager 處理常式,或 pager_vmo 不是 VMO 控制代碼。
ZX_ERR_ACCESS_DENIED pager 沒有 ZX_RIGHT_MANAGE_VMO 或 pager_vmo
ZX_RIGHT_WRITE。
ZX_ERR_INVALID_ARGS:
- pager_vmo 不是透過 pager 建立的 VMO。
- offset 或 length 未對齊頁面。
- op 是 ZX_PAGER_OP_FAIL,data 不是 ZX_ERR_IO,ZX_ERR_IO_DATA_INTEGRITY
或 ZX_ERR_BAD_STATE。
- op 為 ZX_PAGER_OP_WRITEBACK_BEGIN,data 不是 0 或 ZX_VMO_DIRTY_RANGE_IS_ZERO。
ZX_ERR_OUT_OF_RANGE 在 pager_vmo 中指定的範圍無效。
pager_vmo 中的指定範圍不支援ZX_ERR_NOT_SUPPORTED op。
ZX_ERR_NOT_FOUND 運算為 ZX_PAGER_OP_DIRTY,且範圍以 offset 表示,
length 包含尚未提供的區域,或先前已填入資料但之後卻已填入的區域
不會被核心排除。
ZX_ERR_BAD_STATE op 為 ZX_PAGER_OP_DIRTY 或 ZX_PAGER_OP_FAIL,且 pager_vmo 已
從 Pager 卸離。