Rentang alamat virtual yang besar dapat memiliki hanya sedikit transisi state page. Membaca satu entri pagemap untuk setiap virtual page memang memperlihatkan state pada granularitas page, tetapi user space harus memeriksa rangkaian entri yang panjang. Linux PAGEMAP_SCAN memindahkan filtering ke kernel dan melaporkan span yang cocok sebagai record struct page_region.

Interface ini berupa ioctl() pada /proc/PID/pagemap. Request berisi interval alamat, predicate kategori, return mask, dan output vector. Kernel berjalan melalui page table lalu menghasilkan region berurutan yang properti page terpilihnya memenuhi request. Bentuk inspeksi page table berubah dari stream nilai per-page menjadi query rentang yang sudah difilter.

Category mask memisahkan seleksi dari state yang dikembalikan

struct pm_scan_arg memiliki tiga field kategori untuk memilih entri: category_mask, category_anyof_mask, dan category_inverted. Struktur yang sama juga memiliki return_mask, yang menentukan bit kategori mana yang disalin ke setiap region hasil.

category_mask mewajibkan seluruh bit terpilih cocok. category_anyof_mask mengizinkan page memenuhi syarat ketika salah satu kategori terpilih tersedia. category_inverted membalik arti kategori terpilih sebelum aturan pencocokan diterapkan. Kombinasi field ini memungkinkan scan menyatakan kondisi di kernel tanpa mengembalikan semua entri lalu membuang sebagian besar hasil di user space.

Dokumentasi kernel saat ini mencantumkan kategori seperti PAGE_IS_PRESENT, PAGE_IS_SWAPPED, PAGE_IS_FILE, PAGE_IS_PFNZERO, PAGE_IS_HUGE, PAGE_IS_SOFT_DIRTY, PAGE_IS_WPALLOWED, dan PAGE_IS_WRITTEN. Kernel yang lebih baru dapat menyediakan kategori tambahan, sehingga UAPI yang didukung kernel yang sedang berjalan tetap menjadi batas aktual bagi aplikasi.

Selection mask dan return mask memiliki fungsi berbeda. Proses dapat memfilter berdasarkan satu kumpulan properti sambil meminta subset informasi kategori yang berbeda pada hasil. Pemisahan ini menjaga predicate query agar tidak terikat pada representasi hasil.

Hasil mendeskripsikan run, bukan record PTE individual

Setiap output struct page_region berisi start, end, dan categories. Page yang bersebelahan dengan returned state yang kompatibel dapat direpresentasikan sebagai satu region. Pola dengan sedikit perubahan state karena itu dapat menghasilkan jauh lebih sedikit record daripada jumlah page yang dilalui.

Representasi tersebut tidak mengubah granularitas informasi dasarnya. Interface melaporkan state page table pada granularitas ukuran page; penggabungan rentang hanya merupakan encoding ringkas untuk page berurutan dengan klasifikasi relevan yang sama.

Output vector memiliki vec_len terbatas. Scan dapat berhenti karena vector penuh, karena max_pages tercapai, atau karena seluruh interval request sudah diproses. walk_end melaporkan alamat tempat page-table walk berhenti. Kode yang memindai mapping besar karena itu perlu memperlakukan walk_end sebagai continuation state, bukan menganggap satu pemanggilan selalu mencakup seluruh interval.

Aturan continuation tersebut juga penting ketika page table berubah secara concurrent. Beberapa pemanggilan tidak membentuk transaksi snapshot. Proses target dapat melakukan fault-in, mengalami reclaim, me-remap rentang, atau mengubah write state di antara pemanggilan. walk_end membuat iterasi presisi, tetapi tidak membekukan address space.

PAGE_IS_SOFT_DIRTY mengekspos mekanisme soft-dirty melalui scan

Soft-dirty Linux menandai entri page table setelah write. Workflow tradisional menghapus state soft-dirty melalui /proc/PID/clear_refs, membiarkan workload berjalan, lalu memeriksa bit 55 pada /proc/PID/pagemap untuk entri yang relevan.

PAGEMAP_SCAN dapat memilih PAGE_IS_SOFT_DIRTY dan mengembalikan rentang yang membawa kategori tersebut. Dengan cara ini, aplikasi tidak perlu mendekode setiap entri pagemap 64-bit hanya untuk menemukan page yang state soft-dirty-nya cocok dengan query.

Batas semantik soft-dirty tetap berlaku. Penghapusan state soft-dirty menghapus writable state pada PTE sehingga write berikutnya dapat memicu fault dan membuat kernel menandai entri itu kembali. Perubahan mapping juga memengaruhi sinyal: mapping yang baru dibuat atau diperluas ditandai soft-dirty agar user space dapat mendeteksi pembaruan address space. Scan menyediakan interface retrieval yang lebih terstruktur; ia tidak mengubah soft-dirty menjadi hardware write log atau riwayat immutable.

PAGE_IS_WRITTEN terkait dengan asynchronous write protection userfaultfd

PAGE_IS_WRITTEN mewakili jalur dirty tracking yang berbeda. Dokumentasi kernel mendefinisikannya untuk VMA yang didaftarkan dengan userfaultfd write-protect mode dan asynchronous write protection aktif. Kategori ini melaporkan page yang ditulis sejak write protection diterapkan.

Setup memerlukan userfaultfd yang dikonfigurasi dengan UFFD_FEATURE_WP_ASYNC, kemudian memory target didaftarkan menggunakan UFFDIO_REGISTER_MODE_WP. Page dapat diberi write protection, lalu scan berikutnya dapat memilih PAGE_IS_WRITTEN untuk menemukan write.

State ini bukan generic dirty bit untuk sembarang VMA. Di luar registration dan feature state userfaultfd yang diwajibkan, aplikasi tidak dapat memberikan arti yang sama kepada PAGE_IS_WRITTEN. Kategori tersebut merupakan bagian dari protokol tracking yang terkoordinasi antara user space dan kernel.

Dokumentasi kernel menyebut jalur ini sebagai alternatif dengan performa lebih baik daripada soft-dirty untuk normal page dan mencatat bahwa mekanisme tersebut tidak terkena persoalan VMA merging pada soft-dirty tracking. Kasus huge page tetap memerlukan perhatian karena mapping THP atau Hugetlb dapat membuat page tambahan ikut dilaporkan.

Scan dapat menggabungkan observasi dengan write protection

PM_SCAN_WP_MATCHING meminta kernel memberi write protection pada page yang cocok dengan kriteria scan. Operasi ini dapat digabungkan dengan pengumpulan hasil sehingga page-table walk yang sama melaporkan rentang yang cocok sekaligus menerapkan asynchronous userfaultfd write protection.

PM_SCAN_CHECK_WPASYNC menambahkan batas yang lebih ketat: operasi dibatalkan jika menemukan page yang tidak menyediakan asynchronous write protection. Properti ini berguna ketika penerapan model proteksi parsial secara diam-diam dapat merusak protokol dirty tracking.

Penggabungan collection dan protection memperkecil celah yang muncul jika scan dan write-protection pass dilakukan secara terpisah. Jaminannya terbatas pada operasi yang dilakukan kernel; pemrosesan user space yang tidak terkait tidak menjadi atomic terhadap write berikutnya. Consumer tetap memerlukan protokol untuk menetapkan tracking epoch dan menentukan kapan state yang dikumpulkan cukup lengkap untuk checkpointing, migration, replication, atau incremental persistence.

Akses pagemap tetap menjadi batas observasi yang dilindungi

Membuka /proc/PID/pagemap milik proses lain tunduk pada kontrol akses procfs. Informasi page table dapat mengekspos state proses yang sensitif, dan Linux telah memperketat sebagian data pagemap seperti physical frame number.

PAGEMAP_SCAN tidak melewati kontrol tersebut. Ioctl bekerja pada file descriptor pagemap yang sudah dibuka dan mewarisi batas keamanan saat descriptor itu diperoleh. Policy container, ptrace, mount procfs, capability, dan LSM karena itu dapat menentukan apakah suatu proses dapat menginspeksi target sama sekali.

Aplikasi juga tidak boleh memperlakukan kategori page sebagai jaminan yang lebih kuat dari semantiknya. PAGE_IS_PRESENT mendeskripsikan residency state yang diamati saat walk, bukan residency di masa depan. PAGE_IS_FILE mengklasifikasikan backing, bukan ownership aplikasi. PAGE_IS_HUGE mengidentifikasi state huge-page mapping, bukan janji bahwa mapping akan tetap huge. State page table pada dasarnya dinamis kecuali mekanisme terpisah menstabilkan target.

Query rentang membuat page-state tracking mengikuti jumlah transisi

Properti utama PAGEMAP_SCAN bukan jenis memory state baru. Nilainya berasal dari pemindahan filtering page table, penggabungan rentang, dan write-protection opsional ke satu interface kernel.

Untuk workload yang melakukan dirty-memory tracking atau mengklasifikasikan mapping besar, mekanisme ini dapat mengganti decoding per-entry dengan query yang hanya mengembalikan span alamat relevan. walk_end, output vector terbatas, category mask eksplisit, dan persyaratan userfaultfd untuk PAGE_IS_WRITTEN menetapkan batas operasionalnya. Hasilnya adalah primitive page-state yang ringkas, sementara correctness tetap bergantung pada perlakuan eksplisit terhadap perubahan address space concurrent dan tracking epoch di sistem yang menggunakannya.