O hardware (especificamente, o MMU , que faz parte da CPU) determina quais tamanhos de página são possíveis. Não há relação com o tamanho do registro do processador e apenas uma relação indireta com o tamanho do espaço de endereço (na medida em que a MMU determina ambos).
Quase todas as arquiteturas suportam um tamanho de página de 4kB. Algumas arquiteturas suportam páginas maiores (e algumas também suportam páginas menores), mas 4kB é um padrão muito difundido.
O Linux suporta dois tamanhos de página:
- Páginas de tamanho normal, que acredito serem 4kB por padrão em todas as arquiteturas, embora algumas arquiteturas permitam outros valores, por exemplo, 16kB no ARM64 ou 8kB, 16kB ou 64kB no IA64 . Eles correspondem ao nível mais profundo de descritores na MMU (o que o Linux chama de PTE ).
- Páginas enormes , se compiladas (
CONFIG_HUGETLB_PAGE
é necessário e CONFIG_HUGETLBFS
também para a maioria dos usos). Isso corresponde ao segundo nível mais profundo dos descritores da MMU (o que o Linux chama de PMD) (ou pelo menos costuma fazer, não sei se isso vale para todas as arquiteturas).
O tamanho da página é um compromisso entre o uso da memória, o uso da memória e a velocidade.
- Um tamanho de página maior significa mais desperdício quando uma página é usada parcialmente, para que o sistema fique sem memória mais cedo.
- Um nível mais profundo de descritor de MMU significa mais memória do kernel para tabelas de páginas.
- Um nível mais profundo de descritor de MMU significa mais tempo gasto no percurso da tabela de páginas.
Os ganhos de tamanhos maiores de página são pequenos para a maioria dos aplicativos, enquanto o custo é substancial. É por isso que a maioria dos sistemas usa apenas páginas de tamanho normal.
Você pode consultar o tamanho da página (normal) no seu sistema com a getconf
utilidade ou a função C sysconf
.
$ getconf PAGE_SIZE
4096
Usar páginas enormes exige a montagem do hugetlbfs
sistema de arquivos e os arquivos mmap
ping lá.