Andar na tabela de páginas para endereços virtuais do kernel do Linux

0

Eu escrevi um módulo simples que faz uma caminhada de tabela de páginas padrão em x86_64 usando pgd_offset (), pud_offset, pmd_offset e pte_offset_map () para obter o PTE do endereço virtual fornecido. Isso funciona bem para endereços virtuais de espaço do usuário, mas se eu conectar um endereço virtual do kernel (que é definitivamente mapeado), recebo o erro PMD (ao verificar com pmd_error () e pmd_bad ()). Alguém poderia explicar por que a caminhada da página não funciona para endereços do kernel?

Eu estava lendo que os endereços virtuais do kernel podem ser convertidos para as páginas correspondentes (ou seja, página struct), subtraindo PAGE_OFFSET e, em seguida, usando o array mem_map para obter a página. Eu consigo acessar a página desta forma para um endereço virtual do kernel, mas como obtenho o PTE correspondente?

Para resumir, duas perguntas: (1) por que a tabela table walk funciona somente para endereços virtuais de espaço do usuário e (2) como obtenho uma PTE para um endereço virtual do kernel?

    
por kinv 03.02.2018 / 07:36

0 respostas

Tags