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