GNU/Linux >> Linux Esercitazione >  >> Linux

come viene determinata la dimensione della pagina nello spazio degli indirizzi virtuali?

Puoi scoprire la dimensione predefinita della pagina di un sistema interrogando la sua configurazione tramite getconf comando:

$ getconf PAGE_SIZE
4096

o

$ getconf PAGESIZE
4096

NOTA: Le unità di cui sopra sono tipicamente in byte, quindi 4096 equivale a 4096 byte o 4kB.

Questo è cablato nei sorgenti del kernel Linux qui:

Esempio

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

In che modo lo spostamento ti dà 4096?

Quando sposti i bit, stai eseguendo una moltiplicazione binaria per 2. Quindi, in effetti, uno spostamento di bit a sinistra (1 << PAGE_SHIFT ) esegue la moltiplicazione di 2^12 =4096.

$ echo "2^12" | bc
4096

L'hardware (in particolare, la MMU, che fa parte della CPU) determina quali dimensioni di pagina sono possibili. Non c'è alcuna relazione con la dimensione del registro del processore e solo una relazione indiretta con la dimensione dello spazio degli indirizzi (in quanto la MMU determina entrambi).

Quasi tutte le architetture supportano una dimensione di pagina di 4kB. Alcune architetture supportano pagine più grandi (e alcune supportano anche pagine più piccole), ma 4kB è un valore predefinito molto diffuso.

Linux supporta due dimensioni di pagina:

  • Pagine di dimensioni normali, che credo siano 4kB per impostazione predefinita su tutte le architetture, sebbene alcune architetture consentano altri valori, ad es. 16kB su ARM64 o 8kB, 16kB o 64kB su IA64. Questi corrispondono al livello più profondo di descrittori sulla MMU (quello che Linux chiama PTE).
  • Pagine enormi, se compilate in (CONFIG_HUGETLB_PAGE è necessario, e CONFIG_HUGETLBFS anche per la maggior parte degli usi). Questo corrisponde al secondo livello più profondo dei descrittori MMU (quello che Linux chiama PMD) (o almeno lo fa di solito, non so se vale per tutte le architetture).

La dimensione della pagina è un compromesso tra utilizzo della memoria, utilizzo della memoria e velocità.

  • Una pagina di dimensioni maggiori significa più spreco quando una pagina viene utilizzata parzialmente, quindi il sistema esaurisce prima la memoria.
  • Un livello di descrittore MMU più profondo significa più memoria del kernel per le tabelle delle pagine.
  • Un livello di descrittore MMU più profondo significa più tempo speso nell'attraversamento della tabella delle pagine.

I vantaggi di formati di pagina più grandi sono minimi per la maggior parte delle applicazioni, mentre il costo è notevole. Questo è il motivo per cui la maggior parte dei sistemi utilizza solo pagine di dimensioni normali.

Puoi interrogare la dimensione (normale) della pagina sul tuo sistema con getconf utility o la funzione C sysconf .

$ getconf PAGE_SIZE
4096

L'utilizzo di pagine enormi richiede il montaggio del hugetlbfs filesystem e mmap ping lì.


Linux
  1. Quanto spazio di scambio aggiungere per Oracle Database su Linux

  2. Quanto è portatile mmap?

  3. malloc restituisce la memoria o lo spazio degli indirizzi virtuali

  4. Come accedere agli indirizzi fisici dallo spazio utente in Linux?

  5. Come allocare la memoria che è allineata alle dimensioni della pagina?

Come trovare l'indirizzo IP in Linux

Come aumentare lo spazio su disco virtuale della VM su VirtualBox

Come aumentare la dimensione del disco delle macchine virtuali esistenti in VirtualBox

Come modificare l'indirizzo IP su Linux

Linux:come viene suddiviso uno spazio di indirizzi virtuali di processo a 64 bit in Linux?

Come aumentare lo spazio su disco virtuale VM su VirtualBox e VMware