自从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之后我如何仍然分配可执行内存?
EXPORT_SYMBOL(__vmalloc_node_range)
。如果我正确理解EXPORT_SYMBOL
,这意味着您无法在内核模块中使用此函数。 - XanderERROR: modpost: "__vmalloc_node_range" [<ko_file_location>] undefined!
,尽管这个函数在vmalloc.h
中被列出来了。 - Xanderint set_memory_x(unsigned long addr, int numpages);
不过我不确定它是否被导出。 - Mathieuset_memory_x()
函数适用于物理内存而非虚拟内存吗? - Xander