【问题标题】:Compiling linux kernel module show_mem routine编译linux内核模块show_mem例程
【发布时间】:2015-03-02 00:30:56
【问题描述】:

我正在尝试从用户定义的内核模块中的 mm.h 调用 show_mem()。当我编译它显示 show_mem 未定义。我正在运行 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);

下面是make文件-

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'**

任何建议,请。

【问题讨论】:

    标签: c linux makefile linux-kernel


    【解决方案1】:

    根本原因

    您不能在可加载模块中使用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。实现这一点也可能非常困难。

    结论

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

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2011-06-06
      • 2017-10-01
      • 2015-09-21
      • 2012-02-22
      • 2014-01-25
      • 1970-01-01
      相关资源
      最近更新 更多