如何在 Linux 内核模块中分配可执行页面?

Posted

技术标签:

【中文标题】如何在 Linux 内核模块中分配可执行页面?【英文标题】:How to allocate an executable page in a Linux kernel module? 【发布时间】:2011-01-28 08:46:25 【问题描述】:

我正在编写一个 Linux 内核模块,我想分配一个可执行页面。普通的kmalloc() 在一个不可执行的页面中返回一个指针,当在那里执行代码时我得到一个内核恐慌。它必须在 Ubuntu Karmic x86, 2.6.31-20-generic-pae 上运行。

【问题讨论】:

我能问一下你为什么想要一个可执行页面吗?我很好奇。 【参考方案1】:
/**
 * vmalloc_exec - allocate virtually contiguous, executable memory
 * @size:     allocation size
 *
 * Kernel-internal function to allocate enough pages to cover @size
 * the page level allocator and map them into contiguous and
 * executable kernel virtual space.
 *
 * For tight control over page level allocator and protection flags
 * use __vmalloc() instead.
 *
 * Return: pointer to the allocated memory or %NULL on error
 */
void *vmalloc_exec(unsigned long size)

    return __vmalloc_node(size, 1, GFP_KERNEL, PAGE_KERNEL_EXEC,
                  NUMA_NO_NODE, __builtin_return_address(0));

【讨论】:

【参考方案2】:
#include <linux/vmalloc.h>
#include <asm/pgtype_types.h>
...
char *p = __vmalloc(byte_size, GFP_KERNEL, PAGE_KERNEL_EXEC);
...
if (p != NULL) vfree(p);

【讨论】:

以上是关于如何在 Linux 内核模块中分配可执行页面?的主要内容,如果未能解决你的问题,请参考以下文章

在linux中分配物理内存缓冲区

如何从 Linux 内核模块中的逻辑地址获取物理地址?

linux内核页表更新

在 Linux 内核中分配用户空间内存

linux下如何从FIT镜像(*.itb)中分离出内核根文件系统和设备树?

如何以编程方式获取 linux 内核页面大小