zx_pager_query_dirty_ranges

摘要

在分頁器擁有的 VMO 中查詢連續範圍的骯髒頁面。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_pager_query_dirty_ranges(zx_handle_t pager,
                                        zx_handle_t pager_vmo,
                                        uint64_t offset,
                                        uint64_t length,
                                        void* buffer,
                                        size_t buffer_size,
                                        size_t* actual,
                                        size_t* avail);

說明

查詢 pager_vmo,在 [offsetoffset + length] 範圍內連續執行的網頁數量 未寫回網頁伺服器來源,但仍有未完成的修改。 pager_vmo 必須事先是由 zx_pager_create_vmo() 透過 pager 建立。 offsetlength 則不需對齊頁面,但系統會將其四捨五入至頁面邊界 執行查詢。

buffer 應指向 zx_vmo_dirty_range_t 結構體的陣列,以保留 查詢,buffer_size 應容納陣列。

typedef struct zx_vmo_dirty_range {
  // Represents the range [offset, offset + length).
  uint64_t offset;
  uint64_t length;
  // Any options applicable to the range.
  // ZX_VMO_DIRTY_RANGE_IS_ZERO indicates that the range contains all zeros.
  uint64_t options;
} zx_vmo_dirty_range_t;

actual 這個選用指標可以傳回寫入 buffer 的 Dirty 範圍數量。

avail 是選用指標,用於傳回可讀取的骯髒範圍數量。如果 buffer 太大,播映資訊會大於實際值。

成功後,「實際」會包含複製到「緩衝區」的骯髒範圍數量。 複製到 buffer 的骯髒範圍數量只有 buffer_size 限制,即 可能有的 [offsetoffset + length] 中有更多的骯髒範圍 buffer 才能調整。呼叫端可能會假設在 表示呼叫將包含在 buffer 中,或起始偏移值會嚴格大於 小於 buffer 的最後一個範圍。因此,呼叫端可以推動 offset 並進行另一個查詢 發掘更多骯髒的範圍,直到播映資訊為零。

要查詢 VMO 中所有骯髒範圍的使用者程式碼範例,可能會如下所示:


  zx_vmo_dirty_range_t ranges[5];
  size_t actual = 0;
  size_t avail = 0;
  uint64_t start = 0;
  uint64_t len = vmo_size;

  while (len > 0) {
    zx_status_t st = zx_pager_query_dirty_ranges(pager, vmo, start, len,
                                                 &ranges[0],
                                                 5 * sizeof(zx_vmo_dirty_range_t),
                                                 &actual, &avail);
    // Process the |ranges| returned as needed.
    ProcessDirtyRanges(&ranges[0], actual);

    // We've read all the dirty ranges that existed before the query.
    if (actual == avail) {
      break;
    }
    // We used up the entire |ranges| buffer, but there are more dirty ranges to be read.
    // Advance start beyond the last dirty range found.
    uint64_t new_start = ranges[4].offset + ranges[4].length;
    len -= (new_start - start);
    start = new_start;
  }

權限

pager 必須是 ZX_OBJ_TYPE_PAGER 類型,且具有 ZX_RIGHT_MANAGE_VMO

pager_vmo 必須是 ZX_OBJ_TYPE_VMO 類型,且包含 ZX_RIGHT_READ

傳回值

zx_pager_query_dirty_ranges() 會在成功時傳回 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_READ

ZX_ERR_INVALID_ARGS pager_vmo 不是透過 pager 建立的 VMO,或者 buffer 無效 指標。

ZX_ERR_OUT_OF_RANGEpager_vmo 中指定的範圍無效。

另請參閱