Linux 5.x内核版本下如何在LKM中分配可执行内存空间?
在Linux内核5.15.x版本LKM中分配可执行内存空间的方法
在5.15.x及后续内核版本中,__vmalloc接口被简化,不再直接接收内存属性参数,你可以通过以下两种方式在LKM中分配可执行内存:
1. 使用专用的vmalloc_exec()函数
内核提供了vmalloc_exec()封装函数,专门用于分配带可执行属性的虚拟内存区域,它是对通用vmalloc接口的封装,默认携带可执行权限。
示例代码:
#include <linux/vmalloc.h> void *exec_buf; size_t buf_size = PAGE_SIZE * 2; // 分配可执行内存 exec_buf = vmalloc_exec(buf_size); if (!exec_buf) { // 处理分配失败逻辑 return -ENOMEM; } // 使用完成后释放内存 vfree(exec_buf);
2. 用__vmalloc_node_range()实现自定义分配(更灵活)
如果需要更精细的控制(比如指定NUMA节点、内存对齐要求等),可以直接调用底层的__vmalloc_node_range(),通过参数显式设置可执行属性:
vm_flags参数需包含VM_EXEC标记page_prot参数传入PAGE_KERNEL_EXEC来设置页表的可执行权限
示例代码:
#include <linux/vmalloc.h> #include <linux/mm.h> void *exec_buf; size_t buf_size = PAGE_SIZE * 2; gfp_t gfp_mask = GFP_KERNEL | __GFP_ZERO; unsigned long align = PAGE_SIZE; int node = NUMA_NO_NODE; exec_buf = __vmalloc_node_range(buf_size, align, VMALLOC_START, VMALLOC_END, gfp_mask, PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, node, __builtin_return_address(0)); if (!exec_buf) { return -ENOMEM; } // 释放内存 vfree(exec_buf);
注意事项
- 内核的安全配置(如
CONFIG_STRICT_MODULE_RWX)可能限制模块内存的可执行权限,需确保你的内核配置允许此类操作。 - 写入可执行内存的代码需符合内核指令集要求,避免因非法指令引发系统崩溃。
内容的提问来源于stack exchange,提问作者jafarlihi
相关产品推荐
相关产品推荐

