Configure manualmente o bit NX de PTE específico

2

No Ubuntu com kernel 4.16.7 Estou escrevendo uma chamada de sistema personalizada e, como o título indica, eu quero definir o bit NX de uma entrada de tabela de página específica. Até agora eu tenho este pedaço de código, onde eu estou fazendo uma caminhada de tabela de páginas para obter o PTE que eu quero e, em seguida, tentar definir seu bit NX:

pgd = pgd_offset(mm, addr);
if (pgd_none(*pgd) || pgd_bad(*pgd)){
    printk("Invalid pgd");
    return -1;
}

p4d = p4d_offset(pgd, addr);
if (p4d_none(*p4d) || p4d_bad(*p4d)){
    printk("Invalid p4d");
    return -1;
}

pud = pud_offset(p4d, addr);
if (pud_none(*pud) || pud_bad(*pud)){
    printk("Invalid pud");
    return -1;
}

pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd) || pmd_bad(*pmd)){
    printk("Invalid pmd");
    return -1;
}

ptep = pte_offset_map(pmd, addr);
if (!ptep){
    printk("Invalid ptep");
    return -1;
}
pte = *ptep;

if (pte_present(pte)){
    printk("pte_set_flags");
    printk("NX bit before:  %d", pte_exec(pte));
    // pte_set_flags(pte, _PAGE_NX);
    // printk("NX bit after :  %d", pte_exec(pte));
    printk("pte_clear_flags");
    // pte_clear_flags(pte, _PAGE_NX); // Same as pte_mkexec()
    pte_mkexec(pte);
    printk("NX bit after :  %d", pte_exec(pte));
    page = pte_page(pte);
    if (page){
        printk("Page frame struct is @ %p", page);
    }

    pte_unmap(ptep);
}

mas não funciona. Todos os comandos printk mostram o mesmo resultado. Alguma idéia?

Obrigado antecipadamente!

    
por Mar Tsan 08.08.2018 / 11:05

1 resposta

0

Então eu encontrei sozinho. O código é o seguinte:

struct vm_area_struct *vma;
unsigned long oldflags, newflags, pfn;

vma = find_extend_vma(mm, addr);
oldflags = vma->vm_flags;
newflags = oldflags &= ~VM_EXEC;

//...
//...
//...

if (pte_present(pte)){
    printk("NX bit before: %d", pte_exec(pte));

    pte = pte_modify(pte, vm_get_page_prot(newflags));
    printk("NX bit after:  %d", pte_exec(pte));

    pfn = pte_pfn(pte);

    flush_cache_page(vma, addr, pfn);
    set_pte(ptep, pte);
    flush_tlb_page(vma, addr);
    update_mmu_cache(vma, addr, ptep);

    pte_unmap(ptep);
}

e, portanto, o bit NX de um PTE específico é alterado.

    
por 17.08.2018 / 11:14

Tags