摘要
對各種呼叫器擁有的 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 卸離。