Quando a memória é alocada via kmalloc
(ou seja, alocação de cache slab como slab_alloc_node
), ela retorna um endereço de memória virtual. Presumivelmente, ao acessar esse endereço virtual, o PTE correspondente (que traduz o endereço virtual para um endereço físico) já existe, permitindo a tradução de endereço porque o endereço do kernel não permite falha de página. Quem cria esse PTE e quando ele é criado?
Estou usando um sistema de 64 bits, não um de 32 bits. Em sistemas de 32 bits, entendo que há uma região de “memória baixa” (tipicamente dentro de 1 GiB), e que essa memória baixa é pré-mapeada para a memória física durante a inicialização.
No entanto, estou curioso sobre como isso funciona em sistemas de 64 bits. De acordo com esta postagem do StackOverflow ( https://stackoverflow.com/questions/30541036/will-physical-addresses-of-all-paging-structures-in-linux-be-mapped-in-the-page ), ele diz que em sistemas de 64 bits,
“todos os endereços físicos são sempre mapeados com um mapeamento Supervisor na metade do kernel do espaço de endereço.”
, E aqui ( Em qual tabela de páginas de processos o vmalloc() aloca nova memória? ) disse
as entradas da tabela de páginas para kmalloc já foram alocadas.
Quero verificar se isso é realmente verdade. Eis o motivo de meu ceticismo: suponha que minha máquina tenha 128 GiB de DRAM e cada PTE tenha 8 bytes. Então, apenas a tabela de páginas em si exigiria 256 MiB (128 GiB/4 KiB * 8 Byte). Mas quando executo numastat -m após a inicialização, o tamanho da PageTable não parece ser tão grande. Então, imagino o que realmente está acontecendo.
Sim, no x86 de 64 bits o kernel realmente mantém um mapeamento permanente de memória física — até 64 TiB com tabelas de páginas de quatro níveis, 32 PiB com tabelas de páginas de cinco níveis. Veja Como um espaço de endereço virtual de processo de 64 bits é dividido no Linux? e a documentação do kernel para detalhes. Esse mapeamento é configurado por
init_memory_mapping
.O mapeamento físico usa páginas enormes, por isso não precisa de tanta memória quanto você espera.