自Linux 5.8内核发布以来,*__vmalloc()
的签名已从:
void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot)
到这
void *__vmalloc(unsigned long size, gfp_t gfp_mask)
这意味着你不能通过这个函数来分配可执行内存。所以这就是你的代码在更新后的样子:
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0)
return __vmalloc(len, GFP_KERNEL, PAGE_KERNEL_EXEC);
#else
return __vmalloc(len, GFP_KERNEL);
#endif
但这意味着,如果不使用内核的noexec
参数,就不可能为内核〉= 5.8分配可执行内存。
这里有什么替代方案,或者换句话说,在内核5.8之后,我如何仍然分配可执行内存?
1条答案
按热度按时间92dk7w1h1#
看看vmalloc.c,我们可以看到
__vmalloc
调用__vmalloc_node
,__vmalloc_node
调用__vmalloc_node_range
(请参阅下文)__vmalloc_node_range
保留了prot
参数。因此,我们可以想象从
__vmalloc_node_range
重新创建__vmalloc(..., PAGE_KERNEL_EXEC);
:从
vmalloc.c
中提取的代码: