Memahami Linux / proc / id / maps

156

Saya mencoba memahami penggunaan memori aplikasi Linux yang tertanam. The /proc/pid/mapsutilitas / berkas tampaknya menjadi sumber yang baik untuk melihat rincian. Sayangnya saya tidak mengerti semua kolom dan entri.

Apa yang dimaksud dengan entri inode 0 anonim? Ini tampaknya beberapa segmen memori yang lebih besar.

simon
sumber
1
proc(5) mmap(2)"Memahami Kernel Linux" 9.3. Wilayah Memori; 16.2. Memory Mapping "Memahami Linux Virtual Memory Manager" 4.4 Memory Region
wRAR

Jawaban:

263

Setiap baris dalam /proc/$PID/mapsmenggambarkan wilayah memori virtual yang bersebelahan dalam suatu proses atau utas. Setiap baris memiliki bidang berikut:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • address - Ini adalah alamat awal dan akhir wilayah dalam ruang alamat proses
  • izin - Ini menjelaskan bagaimana halaman di wilayah tersebut dapat diakses. Ada empat izin berbeda: baca, tulis, jalankan, dan bagikan. Jika baca / tulis / eksekusi dinonaktifkan, -akan muncul bukannya r/ w/ x. Jika suatu wilayah tidak dibagi , itu adalah pribadi , sehingga pakan muncul alih-alih sebuah s. Jika proses mencoba mengakses memori dengan cara yang tidak diizinkan, kesalahan segmentasi dihasilkan. Izin dapat diubah menggunakan mprotectpanggilan sistem.
  • offset - Jika wilayah itu dipetakan dari file (menggunakan mmap), ini adalah offset dalam file tempat pemetaan dimulai. Jika memori tidak dipetakan dari file, itu hanya 0.
  • perangkat - Jika wilayah itu dipetakan dari file, ini adalah nomor perangkat utama dan kecil (dalam hex) tempat file itu hidup.
  • inode - Jika wilayah itu dipetakan dari file, ini adalah nomor file.
  • pathname - Jika wilayah itu dipetakan dari file, ini adalah nama file. Bidang ini kosong untuk wilayah yang dipetakan secara anonim. Ada juga daerah khusus dengan nama seperti [heap], [stack], atau [vdso]. [vdso]kependekan dari virtual shared shared object. Ini digunakan oleh panggilan sistem untuk beralih ke mode kernel. Ini artikel yang bagus tentang itu: "Apa itu linux-gate.so.1?"

Anda mungkin memperhatikan banyak wilayah anonim. Ini biasanya dibuat oleh mmaptetapi tidak dilampirkan ke file apa pun. Mereka digunakan untuk banyak hal lain seperti memori bersama atau buffer yang tidak dialokasikan di heap. Sebagai contoh, saya pikir pthread library menggunakan wilayah anonim yang dipetakan sebagai tumpukan untuk utas baru.

Jay Conrod
sumber
4
Ya pthreads mengalokasikan blok 8Mb untuk stack dengan bagian yang lebih kecil untuk deteksi stack overflow (saya pikir). Jadi setiap pthread yang dibuat, secara default, mengalokasikan wilayah memori inode 0 sebesar 8Mb dan wilayah inode 0 sebesar 4Kb.
simon
Jadi dalam contoh Anda gpmadalah memetakan file biner di beberapa alamat virtual sejak awal, dengan header ELF dll? Bukankah loader seharusnya mem-parsing header ELF dan memetakan masing-masing bagian, bukan keseluruhan file?
Dmitry Grigoryev
9

pemetaan memori tidak hanya digunakan untuk memetakan file ke dalam memori tetapi juga merupakan alat untuk meminta RAM dari kernel. Ini adalah entri 0 inode tersebut - tumpukan, tumpukan, segmen bss, dan lainnya

Xeor
sumber
5

Silakan periksa: http://man7.org/linux/man-pages/man5/proc.5.html

address           perms offset  dev   inode       pathname
00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon

Bidang alamat adalah ruang alamat dalam proses yang ditempati pemetaan.

Bidang perms adalah seperangkat izin:

 r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

Bidang offset adalah offset ke file / apa pun;

dev adalah perangkat (mayor: minor);

inode adalah inode pada device.0 tersebut menunjukkan bahwa tidak ada inode yang terkait dengan memoryregion, seperti halnya dengan BSS (data yang tidak diinisialisasi).

Bidang pathname biasanya berupa file yang mendukung pemetaan. Untuk file ELF, Anda dapat dengan mudah berkoordinasi dengan bidang offset dengan melihat bidang Offset di header program ELF (baca-l).

Di Linux 2.0, tidak ada bidang yang memberikan pathname.

cahit beyaz
sumber