Akses memori biasanya masuk ke jalur page fault kernel dan selesai tanpa aplikasi memilih isi page tepat pada saat itu. Linux userfaultfd mengubah batas tersebut untuk rentang alamat virtual yang didaftarkan: fault terpilih menjadi event pada file descriptor, lalu manager di user space dapat menyediakan atau mengaktifkan page sebelum thread yang mengalami fault melanjutkan eksekusi.
Mekanisme ini tidak mengganti page table proses dengan struktur data di user space. Kernel tetap memiliki page-table state dan melakukan operasi mapping akhir. User space memperoleh kendali atas kelas fault tertentu beserta waktu resolusinya.
Registrasi menentukan fault yang keluar dari jalur normal
Objek userfaultfd harus lebih dulu menyelesaikan handshake UFFDIO_API. Pertukaran ini menetapkan versi API dan menegosiasikan fitur kernel opsional. Rentang memori kemudian dihubungkan melalui UFFDIO_REGISTER bersama satu atau beberapa mode registrasi yang didukung.
UFFDIO_REGISTER_MODE_MISSING mencegat akses ketika rentang terdaftar belum memiliki page yang terisi. Thread yang melakukan akses diblokir selama event masih tertunda. Manager dapat menyelesaikan fault dengan UFFDIO_COPY, yang memasang isi yang disediakan, atau UFFDIO_ZEROPAGE, yang menyediakan page berisi nol ketika operasi tersebut didukung.
Registrasi berlaku per rentang. Alamat di luar interval terdaftar mengikuti jalur manajemen memori biasa, sedangkan interval terdaftar hanya menghasilkan event untuk kelas fault yang diaktifkan pada rentang tersebut.
Pengiriman fault memisahkan thread terblokir dari pager
Event page fault dibaca sebagai record uffd_msg dari descriptor. Manager biasanya berjalan pada thread atau proses lain sehingga tetap dapat bekerja ketika thread yang menyentuh alamat bermasalah sedang berhenti.
Event memuat alamat fault dan flag yang menandai properti relevan seperti write, write-protection fault, atau minor fault. Negosiasi fitur opsional juga dapat menyediakan thread ID yang menghasilkan event.
Pemisahan ini menciptakan ketergantungan scheduling yang tidak ada pada demand paging biasa. Fault dapat tetap belum terselesaikan ketika manager mengambil data, merekonstruksi state, atau berkoordinasi dengan komponen lain. Thread yang mengalami fault tidak dapat melewati akses tersebut sampai operasi resolusi yang diperlukan selesai.
Operasi resolusi memublikasikan state page secara utuh
UFFDIO_COPY menyalin isi page dari sumber di user space ke rentang yang mengalami fault. UFFDIO_ZEROPAGE menetapkan isi nol. Untuk minor fault, UFFDIO_CONTINUE mengaktifkan backing page yang sudah ada setelah manager menetapkan bahwa page tersebut siap.
Operasi ini menyediakan batas visibilitas atomik untuk page terkait. Thread lain tidak melihat page yang baru tersalin sebagian melalui mapping yang mengalami fault ketika UFFDIO_COPY masih berlangsung. Thread yang menjumpai state belum terselesaikan akan terus mengalami fault sampai kernel menyelesaikan resolusi.
Secara default, resolusi yang berhasil juga membangunkan thread yang terblokir pada rentang terkait. Varian DONTWAKE memisahkan pengisian page dari wakeup sehingga manager dapat menyelesaikan beberapa page dan menjalankan wakeup secara terpisah.
Minor fault mengontrol aktivasi, bukan pembuatan page
UFFDIO_REGISTER_MODE_MINOR menargetkan state yang berbeda dari missing-page mode. Minor fault dapat terjadi ketika backing page sudah tersedia, tetapi page-table entry yang diperlukan oleh mapping pemicu fault belum dipasang.
Pada mapping shmem dan hugetlbfs yang didukung, manager dapat memeriksa atau mengubah backing page melalui mapping lain sebelum menjalankan UFFDIO_CONTINUE. Ioctl terakhir memberi tahu kernel bahwa page yang sudah ada kini dapat dibuat terlihat melalui mapping yang mengalami fault.
Perbedaan ini relevan pada sistem migrasi dan manajemen memori. Missing mode mengontrol page yang disediakan. Minor mode dapat mencegat titik ketika backing page yang sudah tersedia menjadi dapat diakses melalui mapping tertentu.
Write-protect mode mengubah write menjadi event sinkron
UFFDIO_REGISTER_MODE_WP menambahkan kelas fault lain. Setelah rentang didaftarkan dan diproteksi dengan UFFDIO_WRITEPROTECT, write ke page terproteksi dapat menghasilkan event userfaultfd. Event membawa flag write-protection, dan thread penulis tetap terblokir sampai manager melepas protection atau menyelesaikan state melalui cara yang sesuai.
Mode ini dapat mendukung pelacakan dirty page secara presisi karena write pertama pada page terproteksi dapat diamati tepat di batas akses memori. Sifatnya berbeda dari missing mode: mendaftarkan write-protect mode saja tidak meminta notifikasi untuk missing page biasa.
Dukungan berbeda menurut tipe memori dan feature set kernel, sehingga negosiasi fitur merupakan bagian dari kontrak interface, bukan sekadar pemeriksaan kompatibilitas opsional.
Kebijakan akses membatasi fault yang dapat didelegasikan
Pembuatan melalui system call userfaultfd() tunduk pada kebijakan kernel. UFFD_USER_MODE_ONLY membuat objek yang dibatasi pada fault yang berasal dari user mode. Penanganan fault yang berasal dari kernel melalui interface tersebut memerlukan permission atau konfigurasi sistem sesuai kontrak kernel.
Linux juga menyediakan /dev/userfaultfd pada sistem yang mengeksposnya. Akses ke device tersebut diatur melalui permission filesystem, sehingga administrator memiliki titik kontrol terpisah untuk pembuatan objek userfaultfd dengan kemampuan penanganan fault yang lebih luas.
Kontrol ini merupakan batas keamanan. Delegasi penanganan page fault dapat memengaruhi eksekusi thread yang menyentuh memori terdaftar, sehingga ketersediaannya tidak dapat disimpulkan hanya dari keberadaan nomor syscall.
Penutupan descriptor menghapus batas delegasi
Masa hidup registrasi terikat pada objek userfaultfd. Ketika file descriptor terakhir yang merujuk ke objek tersebut ditutup, rentang terdaftar dilepas dari registrasi dan event yang belum dibaca dibuang.
Pager karena itu memerlukan penanganan kegagalan untuk manager itu sendiri, bukan hanya untuk setiap pemanggilan ioctl. Desain yang bergantung pada penyediaan page jarak jauh, live migration, checkpoint restoration, atau paging tingkat aplikasi perlu menetapkan perilaku saat komponen yang bertanggung jawab menyelesaikan fault berhenti atau kehilangan akses ke sumber datanya.
userfaultfd menempatkan titik intersepsi terkontrol di dalam penanganan fault memori virtual Linux. Kernel tetap memegang otoritas atas mapping, sementara user space dapat menentukan isi atau aktivasi page terpilih dan menahan thread yang membutuhkannya sampai state tersebut siap.