2 Perguntas sobre verificação de memória apontando com kernel linux (implementação customizada)

0

Nos é dado um projeto onde estamos implementando checkpointing de memória (basic é apenas olhar páginas e colocar dados em um arquivo (também checar informações sobre a página (private, locked, etc)) e incremental que é onde nós olhamos apenas em se os dados foram alterados anteriormente e despejados em um arquivo). Minha compreensão disso é que estamos praticamente construindo uma versão em menor escala dos estados de economia de memória (eu posso estar errado, mas é exatamente isso que eu estou tirando disso). No momento, estamos usando a abordagem VMA para nosso problema de passar pelo intervalo especificado (desde que não fique abaixo ou acima do intervalo de espaço do usuário (isso significa que não há intervalo de kernel ou abaixo do espaço do usuário)) para relatar os dados encontrados das páginas que encontramos. Eu sei que o vma_area_struct é usado para acessar vma (algumas funções incluindo find_vma ()). Meu problema é que não tenho certeza de como verificamos as páginas individuais dentro desse intervalo de endereços (o usuário nos fornece) de usar essa vma_area_struct. Eu só sei sobre a página struct (isso é muito bonito), mas eu ainda estou aprendendo sobre o kernel em detalhes, então estou fadado a perder as coisas. Há algo que eu estou perdendo sobre o vma_area_sruct ao acessar páginas?

A segunda pergunta é: o que usamos para percorrer cada página individual dentro da vma encontrada (a partir do endereço inicial e final fornecido)?

    
por MD_90 31.10.2018 / 18:25

1 resposta

0

Os VMAs contêm os endereços virtuais dos primeiros e (um após o) último bytes:

struct vm_area_struct {
     /* The first cache line has the info for VMA tree walking. */

     unsigned long vm_start;         /* Our start address within vm_mm. */
     unsigned long vm_end;           /* The first byte after our end address
                                        within vm_mm. */
...

Isso significa que, para obter os dados da página, você precisa primeiro descobrir em qual contexto seu código está sendo executado?

Se estiver dentro do contexto do processo, uma simples abordagem copy_from_user pode ser suficiente para obter os dados reais e uma página (através da totalidade do seu PGD / PUD / PMD / PTE) para obter o PFN e, em seguida, para um struct page . (Cuidado não para usar o sedutor virt_to_page(addr) , pois isso só funcionará nos endereços do kernel).

Em termos de iteração, você precisa apenas iterar em PAGE_SIZEs, sobre os endereços virtuais obtidos dos VMAs.

Note que isto assume que as páginas são realmente mapeadas. Se não ( !pte_present(pte_t a) ) você pode precisar remapear você mesmo para acessar os dados.

Se a sua verificação estiver sendo executada em algum outro contexto (como um kthread / interrupt), você deve remapear a página do swap antes de acessá-la, o que é um caso totalmente diferente. Se você quiser o caminho mais fácil, eu procuraria aqui: link para entender como para lidar com pesquisa / recuperação de trocas.

    
por 03.11.2018 / 02:12