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.