Dimensione della memoria per l'operazione mmap del kernel


9

Sono interessato al modo in cui i file mmaps di Linux sono nella memoria principale (nel mio contesto è per l'esecuzione, ma immagino che il processo mmap sia lo stesso anche per la scrittura e la lettura) e quale dimensione utilizza.

Quindi so che Linux usa il paging con pagine di solito di 4kB (dove nel kernel posso trovare questa dimensione?). Ma cosa significa esattamente questo per la memoria allocata: supponiamo di avere un binario di dimensioni di pochi millesimi byte, diciamo solo 5812B e lo esegui. Cosa succede nel kernel: alloca 2 * 4kB e quindi copia il 5812B in questo spazio, sprecando> 3KB di memoria principale nella seconda pagina?

Sarebbe bello se qualcuno conoscesse il file nel sorgente del kernel in cui è definito il formato della pagina.

Anche la mia seconda domanda è molto semplice, immagino: ho assunto 5812B come dimensione del file. È giusto che questa dimensione sia semplicemente presa dall'inode?

Risposte:


6

Non esiste una relazione diretta tra la dimensione dell'eseguibile e la dimensione in memoria. Ecco una rapida panoramica di ciò che accade quando viene eseguito un binario:

  1. Il kernel analizza il file e lo suddivide in sezioni. Alcune sezioni vengono caricate direttamente in memoria, in pagine separate. Alcune sezioni non vengono caricate (ad es. Simboli di debug).
  2. Se l'eseguibile è collegato dinamicamente, il kernel chiama il caricatore dinamico e carica le librerie condivise richieste ed esegue l'edizione dei collegamenti come richiesto.
  3. Il programma inizia a eseguire il suo codice e di solito richiede più memoria per archiviare i dati.

Per ulteriori informazioni sui formati eseguibili, i collegamenti e il caricamento degli eseguibili, è possibile leggere Linker e caricatori di John R. Levine .

In un eseguibile da 5kB, è probabile che tutto sia codice o dati che devono essere caricati in memoria ad eccezione dell'intestazione. Il codice eseguibile sarà almeno una pagina, forse due, e quindi ci sarà almeno una pagina per lo stack, probabilmente una pagina o per l'heap (altri dati), oltre alla memoria utilizzata dalle librerie condivise.

Sotto Linux, puoi controllare i mapping di memoria per un eseguibile con cat /proc/$pid/maps. Il formato è documentato nella proc(5)pagina man; vedi anche Comprensione di Linux / proc / id / maps .


0

Sì: alla fine ottieni due pagine 4k. I dati vengono caricati su richiesta, quindi se nulla fa mai riferimento alla seconda pagina non verranno mai caricati in memoria.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Non modificare questi valori e non aspettarti che qualcosa funzioni.

Sì, la dimensione del file è memorizzata nell'inode in ext2 / 3.


0

Per la parte di definizione, su un kernel 2.6.38 ~ ish per l'architettura Intel:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT determina la dimensione della pagina * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

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.