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, eCONFIG_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ì.