Защита виртуальной памяти — ядро ​​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