首先 - 我的目标是允许执行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);
但到目前为止还没有运气。如果有人在过去遇到过同样的问题,我很乐意听到一些问题的建议/解决方案。