编译 linux 内核模块 show_mem 例程
Compiling linux kernel module show_mem routine
我正在尝试在用户定义的内核模块中从 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'**
有什么建议,请。
根本原因.
您不能在可加载模块中使用 show_mem()
函数,因为它不是由 EXPORT_SYMBOL
导出的。
可能的解决方案.
基本上您有 3 个选项来解决这个问题。
修改内核源代码
如果您还需要 运行 您的模块——您需要先 build 您的自定义内核,然后 运行 它(而不是 Ubuntu 库存内核) .
虽然这不是可上游的解决方案,但坦率地说,没有人能够使用您的模块(您还需要提供修改后的内核)。
将您的模块编译为内置模块。
它可以在内核树内部完成,使用 obj-y
而不是 obj-m
)。在这种情况下,您将能够使用 show_mem()
函数。就像第一个选项一样,这个选项意味着修改内核源代码。
编写您自己的 show_mem()
实现。
不过我不确定这个,因为结果可能是您根本无法在可加载模块中使用此任务所需的 API。实现这一点也可能相当困难。
结论.
- 如果这只是教育任务(我猜是),我会说第一个选项。
- 如果你真的需要将它作为一个可加载模块来实现,并且你不能修改内核源代码,恐怕你只有第三个选项,这是最难的一个。
我正在尝试在用户定义的内核模块中从 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'**
有什么建议,请。
根本原因.
您不能在可加载模块中使用 show_mem()
函数,因为它不是由 EXPORT_SYMBOL
导出的。
可能的解决方案.
基本上您有 3 个选项来解决这个问题。
修改内核源代码
如果您还需要 运行 您的模块——您需要先 build 您的自定义内核,然后 运行 它(而不是 Ubuntu 库存内核) .
虽然这不是可上游的解决方案,但坦率地说,没有人能够使用您的模块(您还需要提供修改后的内核)。
将您的模块编译为内置模块。
它可以在内核树内部完成,使用
obj-y
而不是obj-m
)。在这种情况下,您将能够使用show_mem()
函数。就像第一个选项一样,这个选项意味着修改内核源代码。编写您自己的
show_mem()
实现。不过我不确定这个,因为结果可能是您根本无法在可加载模块中使用此任务所需的 API。实现这一点也可能相当困难。
结论.
- 如果这只是教育任务(我猜是),我会说第一个选项。
- 如果你真的需要将它作为一个可加载模块来实现,并且你不能修改内核源代码,恐怕你只有第三个选项,这是最难的一个。