MADV_WIPEONFORK Mengganti Memori Private yang Diwariskan dengan Nol
fork() normal memberikan child mapping yang berasal dari address space parent, dengan page private yang writable umumnya ditangani melalui copy-on-write. MADV_WIPEONFORK mengubah aturan pewarisan itu untuk range anonymous private tertentu: mapping tetap ada pada child, tetapi isinya menjadi zero-filled.
Parent tetap menyimpan byte yang sudah ada. Operasi ini mengubah memori yang terlihat oleh child pada batas pembuatan proses, bukan menghapus range milik parent.
Mapping tetap ada tetapi datanya tidak diwariskan
MADV_WIPEONFORK diberikan ke madvise() untuk range alamat yang page-aligned:
void *region = mmap(NULL, len,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0);
madvise(region, len, MADV_WIPEONFORK);Setelah pemanggilan berhasil, fork() berikutnya menghasilkan child dengan range bertanda yang terbaca sebagai memori berisi nol. Perilaku ini berbeda dari MADV_DONTFORK, yang mengecualikan page bertanda dari address space child alih-alih mempertahankan mapping yang sudah dinolkan.
Perbedaan tersebut relevan bagi kode yang mengharapkan suatu range alamat tetap tersedia secara struktural setelah fork(). Dengan MADV_WIPEONFORK, pointer ke dalam range masih menunjuk ke memori yang terpetakan pada child, tetapi payload sebelumnya tidak ada.
Advice terbatas pada memori anonymous private
Linux menerapkan MADV_WIPEONFORK hanya pada mapping anonymous private. Range yang memuat memori file-backed, Huge TLB, MAP_SHARED, atau area VM_PFNMAP tidak memenuhi syarat dan dapat membuat madvise() gagal dengan EINVAL.
Batas tersebut sesuai dengan semantik operasinya. Kernel mengganti state private milik proses yang diwariskan, bukan mendefinisikan ulang isi objek shared atau file mapping.
Alamat yang diberikan ke madvise() juga harus memenuhi persyaratan page alignment di Linux. Ukuran yang diminta dibulatkan mengikuti granularitas page oleh interface tersebut.
Child mewarisi atribut wipe-on-fork
Fork pertama tidak menghabiskan setting ini. Pada child, range terkait tetap ditandai dengan MADV_WIPEONFORK. Jika child tersebut kemudian memanggil fork(), descendant-nya juga menerima memori berisi nol untuk range yang sama.
Persistensi ini menjadikan atribut tersebut bagian dari state mapping sepanjang garis fork. MADV_KEEPONFORK membalikkan setting pada suatu range ketika pewarisan fork normal diperlukan kembali.
Batas execve() berbeda: setting wipe-on-fork dihapus saat execve(). Hal ini selaras dengan penggantian address space yang lebih luas ketika image program baru dieksekusi.
Zeroing saat fork memiliki cakupan yang spesifik
Flag ini cocok untuk material private milik proses yang harus tetap berada pada parent tetapi tidak boleh disalin ke child yang baru dibuat melalui fork. Dokumentasi Linux menyebut data seperti seed PRNG dan secret kriptografi sebagai contoh.
Jaminannya spesifik pada pewarisan fork. Flag ini bukan primitive penghapusan aman umum untuk memori parent, tidak memengaruhi secara retroaktif child yang sudah ada, dan tidak berlaku pada sembarang jenis mapping.
Batas mekanismenya jelas: MADV_WIPEONFORK mempertahankan mapping anonymous private yang dipilih pada setiap child baru sambil mengganti payload yang diwariskan dengan nol. Kode yang perlu menghilangkan mapping sepenuhnya memiliki mekanisme berbeda melalui MADV_DONTFORK; kode yang memerlukan pewarisan normal dapat memulihkannya dengan MADV_KEEPONFORK.