Espaço de endereço do kernel e tabela de páginas do kernel

1

Estou estudando Arquitetura Linux de Kernel Profissional e estou no Capítulo 3 Gerenciamento de Memória. Enquanto estudei o espaço de endereçamento do kernel, ele é dividido em área de mapeamento direto, área vmalloc, área kmap e área de mapeamento fixa.

Oqueeuestouquerendosaberécomoabaixo.

  1. Aáreademapeamentodireto(896MB)doespaçodeendereçodokernelnamáquinade32bitspodeseracessadaporfunçãocomo__va,__pasemMMU?

  2. se1.fortrue,entãoatabeladepáginasmestredokernel(swapper_pg_dir)gerenciaapenas128MB?

  3. Enquantoestouestudandoocódigodokernel,encontreidiferençanafunçãopaging_initentre32bitse64bits.Em32bits,encontreiafunçãopagetable_initqueinicializaemasterizaatabeladepáginasdokernelem 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 em 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 uma tabela de páginas mestre do kernel? Se for verdade, é só acessar a memória do kernel apenas pelo mapeamento direto?

    
por JuHyung Son 20.12.2017 / 20:01

1 resposta

3

Respostas para as perguntas 1 e 2: não, uma vez que a paginação tenha sido ativada, 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 gravar RAM. As macros __va e __pa não acessam memória, elas apenas convertem endereços entre os espaços de endereço. Em uma máquina de 32 bits, __va apenas adiciona 0xc0000000 ao endereço físico fornecido como argumento, porque o mapeamento foi configurado para que o endereço físico N esteja no endereço virtual N+0xc0000000 .

Os endereços que você deseja acessar com a CPU devem ter um mapeamento; você não pode ignorar a MMU. Portanto, um mapeamento que gerencia apenas 128 MB não é suficiente.

    
por 20.12.2017 / 21:22