编译linux内核模块show_mem例程

时间:2015-03-02 00:30:56

标签: c linux makefile linux-kernel

我尝试在用户定义的内核模块中从 mm.h 调用 show_mem()。当我编译它时显示show_mem undefined。我正在运行 Ubuntu 14.04 并且已经编译了 linux内核3.19

/*
 * Author - [Deepak]
 */
#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */
#include <linux/init.h>     /* Needed for the macros */
#include <linux/mm.h>       /* Needed for show_mem */
#include <asm/cacheflush.h>
#include <linux/mm.h>


static char *user_data1 __initdata = "Hello World";
static int *user_data2 __initdata = 2;

static int __init starter(void)
{
    printk(KERN_INFO "[ds494] Loading Hello2 module - %s %d \n",user_data1,user_data2);
    show_mem(1);
    return 0;
}

static void __exit ending(void)
{
    printk(KERN_INFO "[ds494] Exiting Hello2 module - Goodbye World 2\n");
}

module_init(starter);
module_exit(ending);

以下是制作文件 -

obj-m += memmod.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

我得到以下错误 -

  **MODPOST 1 modules
WARNING: "show_mem" [/home/deepak/cs/hw/homework_4/memmod.ko]     undefined!
  LD [M]  /home/deepak/cs/hw/homework_4/memmod.ko
make[1]: Leaving directory '/home/deepak/Downloads/linux-3.19'**

请提出任何建议。

1 个答案:

答案 0 :(得分:5)

根本原因

您无法在可加载模块中使用show_mem()功能,因为它不会由EXPORT_SYMBOL导出。

可能的解决方案

基本上,您有3个选项可以解决此问题。

  1. 修改内核源代码

    • 下载内核源代码(请参阅this
    • 添加用于导出此符号的代码(like this,但此修补程序适用于ARM体系结构,适用于x86请参阅lib/show_mem.c
    • 使用修改后的来源构建您的模块

    如果您还需要运行模块 - 首先需要build自定义内核并运行它(而不是Ubuntu库存内核)。

    虽然这不是可以解决的问题,但坦率地说,没有人能够使用你的模块(你也需要提供修改后的内核)。

  2. 将您的模块编译为内置模块。

    可以使用obj-y代替obj-m在内核树内部完成。在这种情况下,您将能够使用show_mem()功能。就像第一个选项一样,此选项意味着修改内核源代码。

  3. 编写您自己的show_mem()实现。

    但是,我不确定这个,因为可能会发现你根本无法在可加载模块中使用此任务所需的API。实现这一点也很困难。

  4. <强>结论

    • 如果这只是教育任务(我猜是这样),我会说第一个选择。
    • 如果您确实需要将其作为可加载模块实现,并且无法修改内核源代码,我恐怕您只有第3个选项,这是最难选择的选项。