摘要
在分頁器擁有的 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,在 [offset、offset + length] 範圍內連續執行的網頁數量
未寫回網頁伺服器來源,但仍有未完成的修改。
pager_vmo 必須事先是由 zx_pager_create_vmo()
透過 pager 建立。
offset 和 length 則不需對齊頁面,但系統會將其四捨五入至頁面邊界
執行查詢。
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 限制,即 可能有的 [offset、offset + 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
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_READ
。
ZX_ERR_INVALID_ARGS
pager_vmo 不是透過 pager 建立的 VMO,或者 buffer 無效
指標。
ZX_ERR_OUT_OF_RANGE
在 pager_vmo 中指定的範圍無效。
另請參閱
zx_pager_create_vmo()
zx_pager_detach_vmo()
zx_pager_op_range()
zx_pager_query_vmo_stats()
zx_pager_supply_pages()