You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:24:30