Comprensione di Linux / proc / id / maps


156

Sto cercando di capire l'uso della memoria della mia applicazione Linux incorporata. L' /proc/pid/mapsutilità / file sembra essere una buona risorsa per vedere i dettagli. Purtroppo non capisco tutte le colonne e le voci.

Cosa significano le voci anonime dell'inode 0? Questi sembrano essere alcuni dei segmenti di memoria più grandi.


1
proc(5) mmap(2)"Comprensione del kernel Linux" 9.3. Regioni di memoria; 16.2. Mappatura della memoria "Comprensione di Linux Virtual Memory Manager" 4.4 Regioni di memoria
wRAR

Risposte:


263

Ogni riga in /proc/$PID/mapsdescrive un'area 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 accedere alle pagine della regione. Esistono quattro diverse autorizzazioni: lettura, scrittura, esecuzione e condivisione. Se read / write / execute sono disabilitati, -verrà visualizzato a anziché r/ w/ x. Se una regione non è condivisa , è privata , quindi papparirà un anziché un s. Se il processo tenta di accedere alla memoria in modo non consentito, viene generato un errore di segmentazione. Le autorizzazioni possono essere modificate utilizzando la mprotectchiamata di sistema.
  • offset - Se la regione è stata mappata da un file (usando mmap), questo è l'offset nel file da 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 di dispositivo principale e secondario (in esadecimale) in cui risiede 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 le regioni speciali con nomi come [heap], [stack]o [vdso]. [vdso]sta per oggetto virtuale dinamico condiviso. È usato 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 mmapma non sono allegati a nessun file. Sono usati per molte cose varie come memoria condivisa o buffer non allocati sull'heap. Ad esempio, penso che la libreria pthread utilizzi regioni mappate anonime come stack per nuovi thread.


4
Sì, i pthreads stanno allocando blocchi da 8 Mb per uno stack con una sezione più piccola per il rilevamento di overflow dello stack (credo). Quindi ogni pthread creato, per impostazione predefinita, alloca una regione di memoria inode 0 di 8 Mb e una regione di inode 0 di 4Kb.
simon,

Quindi nel tuo esempio gpmsta mappando il file binario in qualche indirizzo virtuale fin dall'inizio, con intestazione ELF ecc.? Il caricatore non dovrebbe analizzare l'intestazione ELF e mappare le singole sezioni, non l'intero file?
Dmitry Grigoryev,

9

il mapping della memoria non viene utilizzato solo per mappare i file nella memoria, ma è anche uno strumento per richiedere RAM dal kernel. Queste sono le voci dell'inode 0: stack, heap, segmenti bss e altro ancora


5

Si prega di controllare: 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 permanente è un insieme di autorizzazioni:

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

Il campo offset è l'offset nel file / qualunque 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à in genere il file su cui è supportato il mapping. Per i file ELF, è possibile coordinare facilmente con il campo offset osservando il campo Offset nelle intestazioni del programma ELF (readelf -l).

Sotto Linux 2.0, non esiste un campo che dia il nome del percorso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.