Perché le aree mappate in memoria di sola lettura hanno pagine sporche?


8

Eseguendo (ad esempio) il seguente comando per ottenere l'elenco delle pagine mappate in memoria:

pmap -x `pidof bash`

Ho ottenuto questo risultato: inserisci qui la descrizione dell'immagine perché alcune pagine di sola lettura sono contrassegnate come "sporche", ovvero scritte che richiedono una riscrittura? Se sono di sola lettura, il processo non dovrebbe essere in grado di scrivere a loro ... (Nell'esempio fornito le pagine sporche sono sempre 4 kB, ma ho trovato altri casi con valori diversi)

Ho controllato anche / proc / pid / smaps e che le pagine sono descritte come "Private Dirty".

Risposte:


7

Una pagina sporca non richiede necessariamente una riscrittura. Una pagina sporca è quella in cui è stata scritta dall'ultima volta che il kernel l'ha contrassegnata come pulita. I dati non devono sempre essere salvati nel file originale.

Le pagine sono private, non condivise, quindi non verrebbero salvate nel file originale. Sarebbe impossibile avere una pagina sporca supportata da un file di sola lettura. Se la pagina deve essere rimossa dalla RAM, verrà salvata in scambio.

Le pagine di sola lettura, private e sporche, ma all'interno dell'intervallo di un file mappato in memoria, sono in genere pagine di dati che contengono costanti che devono essere inizializzate in fase di esecuzione, ma non cambiano dopo essere state inizializzate. Ad esempio, possono contenere dati statici che incorporano puntatori; i valori del puntatore dipendono dall'indirizzo al quale è mappato il programma o la libreria, quindi deve essere calcolato dopo l'avvio del programma, con la pagina in fase di lettura / scrittura in questa fase. Dopo che i puntatori sono stati calcolati, il contenuto della pagina non cambierà mai in questa istanza del programma, quindi la pagina può essere cambiata in sola lettura. Vedere "Ricerca di pagine di memoria sporche" di stosb per un esempio con frammenti di codice.

Più raramente puoi vedere pagine di sola lettura, eseguibili, private, sporche; ciò accade con alcuni linker che mescolano codice e dati più liberamente o con compilazioni just-in-time.


Non l'ho verificato, ma sospetto che tu possa anche ottenere pagine sporche di sola lettura, eseguibili e private con oggetti condivisi non PIC. Mi sembra di ricordare che è per questo che gli oggetti condivisi PIC sono diventati praticamente de facto richiesti.
Andrew Henle,

2

Oltre agli elenchi di casi Gilles :

Quando un processo esegue il fork, il kernel può contrassegnare tutte le sue pagine sporche come di sola lettura e verranno condivise tra padre e figlio. Quando uno dei processi scrive nella pagina, si verificherà un'eccezione e il kernel copierà la pagina e la contrassegnerà come scrivibile. Ciò consente di risparmiare il lavoro di copia delle pagine che alla fine non vengono più modificate da nessuno dei due processi. (Si noti che in questa situazione, le pagine sono contrassegnate come di sola lettura nell'hardware ma sono conosciute dal kernel come scrivibili.)

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.