Защита на виртуалната памет - Linux ядро

На първо място - целта ми е да разреша изпълнението на паметта, разпределена от kmalloc. Даден е следният кодов фрагмент (да приемем, че е даден размерът на функцията foo):

void foo()
{
      printk("Nothing that matters.\n");
}

void bar()
{
     void* s = kmalloc(PAGE_SIZE, GFP_KERNEL);
     memcpy(s, foo, SIZE OF FOO);
     void (*f)(void) = (void(*)(void))s;
     f();

}

Следният код дава gp, защото нямам разрешения за изпълнение за kmalloced разпределената страница.

Реших същия проблем @ OSX с помощта на:

kern_return_t
mach_vm_protect(
mach_port_name_t task,
mach_vm_address_t address,
mach_vm_size_t size,
boolean_t set_maximum,
vm_prot_t new_protection);

и сега се опитвам да намеря начин за разрешаване на този проблем в Linux.

Опитах следното:

    pgd_t* pgd = pgd_offset(mm, address);
    pmd_t* pmd = pmd_offset(pgd, address);  
    pte_t pte = /**pte_offset_map(pmd, address)*/*pte_offset_kernel(pmd, address);
    pte_mkexec(pte);

Но засега няма късмет. Ако някой се е сблъсквал със същия проблем в миналото, ще се радвам да чуя някои предложения / решения на проблема.


person Rouki    schedule 03.01.2015    source източник
comment
Здравейте, подобни въпроси бяха зададени тук: stackoverflow.com/questions/15347858/. Дано помогне.   -  person xyz    schedule 04.01.2015
comment
Помогна ми много! Благодаря.   -  person Rouki    schedule 04.01.2015