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


43

Linux utilizza un sistema di memoria virtuale in cui tutti gli indirizzi sono indirizzi virtuali e non indirizzi fisici. Questi indirizzi virtuali vengono convertiti in indirizzi fisici dal processore.

Per facilitare questa traduzione, la memoria virtuale e fisica sono divise in pagine. A ciascuna di queste pagine viene assegnato un numero univoco; il numero di frame della pagina.

Alcune dimensioni di pagina possono essere 2 KB, 4 KB, ecc. Ma come viene determinato questo numero di dimensioni della pagina? È influenzato dalle dimensioni dell'architettura? Ad esempio, un bus a 32 bit avrà uno spazio di indirizzi di 4 GB.

Risposte:


56

Si può scoprire le dimensioni della pagina di default di un sistema interrogando la configurazione tramite il getconfcomando:

$ getconf PAGE_SIZE
4096

o

$ getconf PAGESIZE
4096

NOTA: le unità sopra indicate sono in genere in byte, quindi il 4096 equivale a 4096 byte o 4kB.

Questo è cablato nel sorgente 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 il cambio ti dà 4096?

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

$ echo "2^12" | bc
4096

2
L'hardware moderno supporta pagine da 2 MB e circa 1 GB. "PAGE_SHIFT" può essere impostato su 21 per pagine da 2 MB come predefinito per la compilazione del kernel?
ReverseFlow

2
@ReverseFlow Per ottenere una risposta del genere, vorrei porre una domanda separata.
Kirill Bulygin,

@sim, chiedendoti perché qui vengono usate manipolazioni di bit? ho letto che il compilatore di solito converte le moltiplicazioni in manipolazioni di bit, dando quindi le stesse prestazioni.
InAFlash,

17

L'hardware (in particolare la MMU , che fa parte della CPU) determina quali dimensioni di pagina sono possibili. Non esiste 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 per impostazione predefinita sono 4 kB su tutte le architetture, sebbene alcune architetture consentano altri valori, ad esempio 16 kB su ARM64 o 8 kB, 16 kB o 64 kB su IA64 . Questi corrispondono al livello più profondo di descrittori sulla MMU (ciò che Linux chiama PTE ).
  • Pagine enormi , se compilate in ( CONFIG_HUGETLB_PAGEè necessario e CONFIG_HUGETLBFSanche per la maggior parte degli usi). Ciò corrisponde al secondo livello più profondo di descrittori MMU (quello che Linux chiama PMD) (o almeno lo fa di solito, non so se questo vale per tutte le architetture).

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

  • Una dimensione della pagina più grande significa più spreco quando una pagina viene parzialmente utilizzata, quindi il sistema esaurisce la memoria prima.
  • 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 guadagni di dimensioni di pagina più grandi sono minuscoli 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.

È possibile interrogare il (normale) formato pagina del tuo sistema con il getconfprogramma di utilità o la funzione C sysconf.

$ getconf PAGE_SIZE
4096

L'uso di pagine enormi richiede il montaggio del hugetlbfsfile system e dei mmapfile ping lì.


Cordiali saluti: L'uso di pagine enormi non richiede il montaggio di hugetlbfs, poiché le note del documento del kernel in fondo possono anche usare chiamate di memoria condivise o un flag mmap. Inoltre, più interessante, puoi abilitare pagine enormi trasparenti, quindi il kernel convertirà automaticamente le pagine normali in pagine enormi quando possibile su tutte le app.
derobert

Questa è la risposta veramente fondamentale. Linux è progettato per utilizzare bene l'hardware di paging. Maggiori informazioni su di paging: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli新疆改造中心法轮功六四事件

0

Le dimensioni della pagina dipendono principalmente dall'architettura del processore. Su x86, dai tempi del processore 386 che ha introdotto la modalità protetta, la dimensione della pagina è stata di 4 kB.

In modalità x64, ci possono essere anche pagine enormi, che hanno dimensioni di 2 MB. Tuttavia, l'utilizzo di questi è un po 'complicato.

Puoi trovare maggiori informazioni sulla dimensione della pagina nell'articolo di Wikipedia


0

Il processore determina le dimensioni della pagina disponibili. Per la maggior parte degli scopi, la dimensione della pagina implementata dall'hardware sui processori x86 e x86_64 è di 4kb. Tuttavia, il sistema operativo può allocare più di una pagina alla volta, se lo desidera, e quindi implementare in modo efficace pagine da 8kb, 16kb o 32kb nel software.

I processori x86 e x86_64 possono anche mescolare rispettivamente le pagine 4mb e 2mb insieme alle pagine standard da 4kb. Se questa funzionalità fosse utilizzata, sarebbe principalmente usata per allocare lo spazio del kernel.

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.