Saya mencoba memahami penggunaan memori aplikasi Linux yang tertanam. The /proc/pid/maps
utilitas / 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.
proc(5)
mmap(2)
"Memahami Kernel Linux" 9.3. Wilayah Memori; 16.2. Memory Mapping "Memahami Linux Virtual Memory Manager" 4.4 Memory RegionJawaban:
Setiap baris dalam
/proc/$PID/maps
menggambarkan wilayah memori virtual yang bersebelahan dalam suatu proses atau utas. Setiap baris memiliki bidang berikut:-
akan muncul bukannyar
/w
/x
. Jika suatu wilayah tidak dibagi , itu adalah pribadi , sehinggap
akan muncul alih-alih sebuahs
. Jika proses mencoba mengakses memori dengan cara yang tidak diizinkan, kesalahan segmentasi dihasilkan. Izin dapat diubah menggunakanmprotect
panggilan sistem.mmap
), ini adalah offset dalam file tempat pemetaan dimulai. Jika memori tidak dipetakan dari file, itu hanya 0.[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
mmap
tetapi 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.sumber
gpm
adalah 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?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
sumber
Silakan periksa: http://man7.org/linux/man-pages/man5/proc.5.html
Bidang alamat adalah ruang alamat dalam proses yang ditempati pemetaan.
Bidang perms adalah seperangkat izin:
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.
sumber