Mengapa daerah hanya-baca yang dipetakan memiliki halaman kotor?

8

Menjalankan (misalnya) perintah berikut untuk mendapatkan daftar halaman yang dipetakan memori:

pmap -x `pidof bash`

Saya mendapatkan hasil ini: masukkan deskripsi gambar di sini Mengapa beberapa halaman hanya-baca ditandai sebagai "kotor", yaitu tulisan yang memerlukan balasan? Jika hanya baca, proses seharusnya tidak dapat menulis kepada mereka ... (Dalam contoh yang diberikan halaman kotor selalu 4 kB, tapi saya menemukan kasus lain dengan nilai yang berbeda)

Saya juga memeriksa / proc / pid / smaps dan halaman itu dideskripsikan sebagai "Private Dirty".

RicoRico
sumber

Jawaban:

7

Halaman yang kotor tidak selalu membutuhkan balasan. Halaman kotor adalah yang ditulis sejak kernel terakhir menandainya sebagai bersih. Data tidak selalu perlu disimpan kembali ke file asli.

Halaman bersifat pribadi, tidak dibagi, sehingga tidak akan disimpan kembali ke file asli. Tidak mungkin memiliki halaman kotor yang didukung oleh file read-only. Jika halaman perlu dihapus dari RAM, itu akan disimpan dalam swap.

Halaman yang hanya baca, pribadi dan kotor, tetapi dalam kisaran file yang dipetakan memori, biasanya halaman data yang berisi konstanta yang perlu diinisialisasi pada saat dijalankan, tetapi tidak berubah setelah mereka diinisialisasi. Misalnya, mereka mungkin berisi data statis yang menyematkan pointer; nilai pointer tergantung pada alamat di mana program atau pustaka dipetakan, sehingga harus dihitung setelah program dimulai, dengan halaman yang dibaca-tulis pada tahap ini. Setelah pointer dihitung, isi halaman tidak akan pernah berubah dalam instance program ini, sehingga halaman dapat diubah menjadi hanya-baca. Lihat “Memburu Halaman Memori Kotor” oleh stosb untuk contoh dengan fragmen kode.

Anda mungkin, lebih jarang, melihat halaman read-only, executable, private, dirty; ini terjadi dengan beberapa penghubung yang mencampur kode dan data lebih bebas, atau dengan kompilasi tepat waktu.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya belum memverifikasinya, tetapi saya curiga Anda juga bisa mendapatkan halaman kotor pribadi dengan read-only, executable, dan non-PIC. Sepertinya saya ingat itu alasan PIC berbagi benda telah cukup banyak menjadi keharusan secara de facto .
Andrew Henle
2

Selain daftar kasus Gilles :

Ketika suatu proses bercabang, kernel dapat menandai semua halaman kotornya sebagai hanya-baca, dan itu akan dibagi antara orang tua dan anak. Ketika salah satu proses menulis ke halaman, pengecualian akan terjadi, dan kernel akan menyalin halaman dan menandainya bisa ditulisi. Ini menyimpan pekerjaan menyalin halaman yang pada akhirnya tidak dimodifikasi lagi oleh kedua proses. (Perhatikan bahwa dalam situasi ini, halaman ditandai hanya-baca di perangkat keras tetapi diketahui oleh kernel dapat ditulis.)

Eric Postpischil
sumber