На първо място - целта ми е да разреша изпълнението на паметта, разпределена от 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);
Но засега няма късмет. Ако някой се е сблъсквал със същия проблем в миналото, ще се радвам да чуя някои предложения / решения на проблема.