Na arquitetura x86, a "paginação estendida" permite que os quadros de página (memória física) tenham 4 MB em vez de 4 KB.
O livro "Understanding the Linux Kernel, 3rd" no capítulo 2 "Memory Addressing", subcapítulo "Paging in Linux", seção "Kernel Page Tables", explica que para a Tabela de Páginas do kernel final quando o tamanho da RAM for menor que 896 MB :
[...] o kernel pode endereçar a RAM fazendo uso de páginas grandes (veja a seção "Paging Estendida" anteriormente neste capítulo).
Porém, na seção "Paging Estendido" (subcapítulo "Paging em Hardware"), está escrito:
A paginação estendida coexiste com a paginação regular.
Na verdade, não entendo como a paginação estendida e a regular coexistem. Alguém pode explicar essas perguntas:
- Em quais casos o kernel usa páginas de 4 MB? ou páginas de 4 KB?
- Qual tamanho de quadro de página será usado para operações kmalloc? para vmalloc?
- Se assumirmos que o código e os dados iniciais (segmentos do kernel, tabelas de páginas provisórias e 128 KB para dados dinâmicos) cabem nos primeiros 8 MB de RAM (como no exemplo dado pelo livro), e se a quantidade real de código e dados os dados têm apenas 5 MB: o kernel desperdiçará 8 - 5 = 3 MB?
Responder1
1. Em quais casos o kernel usa páginas de 4 MB? ou páginas de 4 KB?
O aplicativo pode solicitar uma página enorme, o kernel não determinará o tamanho da página a menos que compile o PAGE_SIZE no código-fonte do kernel. O uso de sinalizadores mmap pode determinar o tamanho da página no código-fonte do aplicativo.
2. Qual tamanho de quadro de página será usado para operações kmalloc? para vmalloc?
kmalloc usa o tamanho de página padrão no kernel Linux, ou seja, PAGE_SIZE no kernel, que é compilado ou determinado em tempo de execução. O mesmo para vmalloc.
3. Se assumirmos que o código e os dados iniciais (segmentos do kernel, tabelas de páginas provisórias e 128 KB para dados dinâmicos) cabem nos primeiros 8 MB de RAM (como no exemplo dado pelo livro), e se a quantidade real de o código e os dados têm apenas 5 MB: o kernel desperdiçará 8 - 5 = 3 MB?
O tamanho da memória residual é determinado por PAGE_SIZE e os dados, se o tamanho da página for 4 MB, os dados forem 5 MB, o tamanho da memória desperdiçada será (PAGE_SIZE*N) - 5 MB = 3 MB.