zx_pager_op_range

摘要

對各種呼叫器擁有的 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 指定、offsetoffsetop 的呼叫器作業 length)。pager_vmo 必須事先透過 pager 建立,步驟如下: zx_pager_create_vmo()offsetlength 必須對齊頁面。「data」是選用項目 參數 (如果指定的 op 支援的話)。

可執行的作業 (即 op 值可以):

ZX_PAGER_OP_DIRTY:使用者空間呼叫器想要轉換位於 [偏移] 範圍的頁面。 offset + length)。這項操作會解除封鎖 指定範圍的 ZX_PAGER_VMO_DIRTY 個網頁要求。

ZX_PAGER_OP_FAIL - userspace 呼叫器無法完成 pager_vmo 的 範圍 [偏移偏移 + 長度),指令為 ZX_PAGER_VMO_READZX_PAGER_VMO_DIRTYdata 包含發生的錯誤 (zx_status_t 錯誤代碼已延伸至 uint64_t 值) - 允許的值為 ZX_ERR_IOZX_ERR_IO_DATA_INTEGRITYZX_ERR_BAD_STATEZX_ERR_NO_SPACEZX_ERR_BUFFER_TOO_SMALL

這樣一來,系統發現該範圍內可能正在等待網頁要求的執行緒,才會將執行緒解除封鎖。如果 封鎖的執行緒透過 zx_vmo_read() / zx_vmo_write()zx_vmo_op_range() 搭配 ZX_VMO_OP_COMMIT,呼叫將會失敗,並顯示錯誤狀態 (資料) 。如果遭封鎖的執行緒透過 VMAR 對應要求網頁,執行緒就會 取得嚴重的頁面錯誤例外狀況

ZX_PAGER_OP_WRITEBACK_BEGIN:使用者空間網頁器想開始寫回範圍中的頁面 [offsetoffset + 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:使用者空間網頁器已將範圍中的頁面寫回範圍內 [offsetoffset + 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 pagerpager_vmo 不是有效的帳號代碼。

ZX_ERR_WRONG_TYPE pager 不是 Pager 處理常式,或 pager_vmo 不是 VMO 控制代碼。

ZX_ERR_ACCESS_DENIED pager 沒有 ZX_RIGHT_MANAGE_VMOpager_vmo ZX_RIGHT_WRITE

ZX_ERR_INVALID_ARGS: - pager_vmo 不是透過 pager 建立的 VMO。 - offsetlength 未對齊頁面。 - opZX_PAGER_OP_FAILdata 不是 ZX_ERR_IOZX_ERR_IO_DATA_INTEGRITYZX_ERR_BAD_STATE。 - opZX_PAGER_OP_WRITEBACK_BEGINdata 不是 0 或 ZX_VMO_DIRTY_RANGE_IS_ZERO

ZX_ERR_OUT_OF_RANGEpager_vmo 中指定的範圍無效。

pager_vmo 中的指定範圍不支援ZX_ERR_NOT_SUPPORTED op

ZX_ERR_NOT_FOUND 運算ZX_PAGER_OP_DIRTY,且範圍以 offset 表示, length 包含尚未提供的區域,或先前已填入資料但之後卻已填入的區域 不會被核心排除。

ZX_ERR_BAD_STATE opZX_PAGER_OP_DIRTYZX_PAGER_OP_FAIL,且 pager_vmo 已 從 Pager 卸離。

另請參閱