2012-03-22 9 views
17

Stavo cercando di vedere la mappa della memoria di un processo su Linux x86-64 usando il comando pmap -x. Mi sono confuso guardando l'output della pmap. In particolare per le voci per la mappatura di librerie dinamiche. Ci sono più voci per loro (in realtà 4 per tutti la maggior parte di loro, con alcuni con 3 voci). Di seguito è riportato un esempiocomprensione uscita pmap

Address   Kbytes RSS Dirty Mode Mapping 

00000036ca200000  88  64  0 r-x-- libpthread-2.5.so 
00000036ca216000 2044  0  0 ----- libpthread-2.5.so 
00000036ca415000  4  4  4 r---- libpthread-2.5.so 
00000036ca416000  4  4  4 rw--- libpthread-2.5.so 

La seconda fila per ciascuna della biblioteca è sempre dimensioni di 2 MB mentre non ha il permesso pagina. In tutte le librerie sembra che il suo RSS sia SEMPRE zero. Le ultime due righe hanno anche la stessa dimensione (che è la dimensione della pagina di base) e le stesse autorizzazioni (una libreria manciata non ha la mappatura rw).

Qualcuno ha qualche spiegazione per questo? Ho la sensazione che probabilmente la mappatura con la protezione di sola lettura viene eseguita dal loader per leggere i metadati della libreria mentre la parte con il permesso eseguibile in realtà il codice per la libreria. Potrei sbagliarmi comunque.

Ma non ho idea di quella fila centrale. Nessun permesso e nessun uso? Qualcuno ha qualche parola di saggezza qui?

Ho anche visto alcune pagine dichiarate sulla memoria anonima e non ha alcun bit di modalità impostato. Cosa rappresentano?

+0

Possibile duplicato di [/ proc/$ pid/maps mostra pagine senza autorizzazioni rwx su x86 \ _64 linux] (http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with -no-rwx-permissions-on-x86-64-linux) –

+0

ha provato a correggere la porzione typo: * con il permesso eseguibile in realtà il codice per la libreria * ... sembra che "is" sia mancante ma non possa essere Sicuro al 100%; potresti aiutare? –

risposta

4

Prima di tutto, è possibile che in questo caso uno stesso processo possa utilizzare più di un'istanza di utilizzo della memoria. Non so se questo è ciò che vuoi sapere. Ho visto che, mentre si utilizza un browser in Linux, con una sola scheda aperta e usando il comando in alto, mostra più di 4 utilizzi nella lista di utilizzo della memoria, coprendo più di 10 MB di memoria. Penso che sia ok a causa del numero maggiore di thread eseguiti dallo stesso processo.

Questo collegamento può essere utile, poiché, nell'esempio di utilizzo stesso, se si osserva, la mappatura del comando -x mostra un numero maggiore di utilizzo.

http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

3

Questi protetti "----" pagine sono pagine di guardia per evitare che i puntatori dall'indicizzazione tra i segmenti di codice e dati della biblioteca. Esiste solo nello spazio virtuale del processo ed esiste per causare un errore se un puntatore supera la fine del segmento.

Se questi non sono stati indirizzati in un file di libreria condivisa, direi che stavano servendo da buffer per l'espansione delle allocazioni in es. malloc o crescita dello stack. Ad esempio, glibc richiede grossi blocchi di spazio di indirizzamento dal kernel per le arene di allocazione locali del thread e li consuma lentamente per allocazioni malloc'd. In una pmap molto più grande di una JVM che sto osservando ce ne sono alcune decine, ognuna delle quali segue una pagina RW o riempiendo lo spazio tra due grandi allocazioni RW ei confini tra loro si spostano man mano che le pagine RW si espandono. Sulle pagine di guardia X86_64 come questa può utilizzare il sistema di protezione della memoria della CPU per rilevare cattive dereferenze del puntatore.