Como coexistem a paginação estendida (4 MB) e regular (4 KB)?

Como coexistem a paginação estendida (4 MB) e regular (4 KB)?

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.

informação relacionada