Ogni riga in /proc/$PID/maps
descrive una regione di memoria virtuale contigua in un processo o thread. Ogni riga ha i seguenti campi:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
- indirizzo - Questo è l'indirizzo iniziale e finale della regione nello spazio degli indirizzi del processo
- autorizzazioni - Descrive come è possibile accedere alle pagine nella regione. Esistono quattro diverse autorizzazioni:lettura, scrittura, esecuzione e condivisione. Se read/write/execute sono disabilitati, un
-
apparirà al posto delr
/w
/x
. Se una regione non è condivisa , è privato , quindi unp
apparirà invece di uns
. Se il processo tenta di accedere alla memoria in un modo non consentito, viene generato un errore di segmentazione. I permessi possono essere modificati utilizzando ilmprotect
chiamata di sistema. - offset - Se la regione è stata mappata da un file (utilizzando
mmap
), questo è l'offset nel file in cui inizia la mappatura. Se la memoria non è stata mappata da un file, è solo 0. - dispositivo - Se la regione è stata mappata da un file, questo è il numero principale e secondario del dispositivo (in esadecimale) in cui si trova il file.
- inode - Se la regione è stata mappata da un file, questo è il numero del file.
- nome percorso - Se la regione è stata mappata da un file, questo è il nome del file. Questo campo è vuoto per le regioni mappate anonime. Ci sono anche regioni speciali con nomi come
[heap]
,[stack]
o[vdso]
.[vdso]
sta per oggetto condiviso dinamico virtuale. Viene utilizzato dalle chiamate di sistema per passare alla modalità kernel. Ecco un buon articolo a riguardo:"Cos'è linux-gate.so.1?"
Potresti notare molte regioni anonime. Questi sono generalmente creati da mmap
ma non sono allegati a nessun file. Sono usati per molte cose varie come memoria condivisa o buffer non allocati nell'heap. Ad esempio, penso che la libreria pthread utilizzi regioni mappate anonime come stack per nuovi thread.
la mappatura della memoria non viene utilizzata solo per mappare i file in memoria, ma è anche uno strumento per richiedere la RAM dal kernel. Queste sono le voci dell'inode 0:stack, heap, segmenti bss e altro
Controlla: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
Il campo dell'indirizzo è lo spazio degli indirizzi nel processo occupato dalla mappatura.
Il campo perms è un insieme di permessi:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
Il campo offset è l'offset nel file/qualsiasi cosa;
dev è il dispositivo (maggiore:minore);
inode è l'inode su quel dispositivo.0 indica che nessun inode è associato alla regione di memoria, come nel caso di BSS (dati non inizializzati).
Il campo del percorso sarà solitamente il file che supporta la mappatura. Per i file ELF, puoi coordinarti facilmente con il campo offset osservando il campo Offset nelle intestazioni del programma ELF (leggi alf -l).
Sotto Linux 2.0, non c'è nessun campo che dia il nome del percorso.