Estou estudando Professional Linux Kernel Architecture e estou no Capítulo 3 Memory Management. Enquanto eu estudava, o próprio espaço de endereço do kernel é dividido em área de mapeamento direto, área vmalloc, área kmap e área de mapeamento fixa.
O que eu estou querendo saber é como abaixo.
A área de mapeamento direto (896 MB) do espaço de endereço do kernel na máquina de 32 bits pode ser acessada por funções como __va, __pa sem MMU?
se 1. for verdadeiro, então a tabela mestre da página do kernel (swapper_pg_dir) gerencia apenas 128 MB?
Enquanto estou estudando o código do kernel, encontrei diferença na função paging_init entre 32 bits e 64 bits. Em 32 bits, encontrei a função pagetable_init que inicializa e domina a tabela de páginas do kernel na função paging_init .
função paging_init em 32 bits
void __init pageit_init(void){
pagetable_init();
__flush_tlb_all();
kmap_init();
olpc_dt_build_devicetree();
sparse_memory_present_with_active_regions(MAX_NUMNODES);
sparse_init();
zone_sizes_init();
}
Mas em 64 bits, não consegui encontrar a função relacionada à tabela de páginas do kernel na função paging_init .
void __init paging_init(void)
{
sparse_memory_present_with_active_regions(MAX_NUMNODES);
sparse_init();
node_clear_state(0, N_MEMORY);
if (N_MEMORY != N_NORMAL_MEMORY)
node_clear_state(0, N_NORMAL_MEMORY);
zone_sizes_init();
}
O kernel de 64 bits não possui tabela de páginas do kernel mestre? Se for verdade, basta acessar a memória do kernel apenas por mapeamento direto?
Respostas às perguntas 1 e 2: não, uma vez habilitada a paginação, as instruções da CPU usam apenas endereços virtuais, que são traduzidos para endereços físicos usando a MMU antes de ler ou escrever na RAM. As macros
__va
e__pa
não acessam a memória, apenas convertem endereços entre os espaços de endereço. Em uma máquina de 32 bits,__va
apenas adiciona0xc0000000
ao endereço físico fornecido como argumento, porque o mapeamento foi configurado para que o endereço físicoN
esteja no endereço virtualN+0xc0000000
.Os endereços que você deseja acessar com a CPU devem ter um mapeamento; você não pode ignorar o MMU. Portanto, um mapeamento que gerencia apenas 128 MB não é suficiente.