dee*_*ank 1 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);
Run Code Online (Sandbox Code Playgroud)
以下是制作文件 -
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
Run Code Online (Sandbox Code Playgroud)
我得到以下错误 -
**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'**
Run Code Online (Sandbox Code Playgroud)
请给我任何建议.
根本原因.
您无法show_mem()在可加载模块中使用函数,因为它不会导出EXPORT_SYMBOL.
可能的方案.
基本上你有3个选项来解决这个问题.
修改内核源代码
如果您还需要运行模块 - 您需要首先构建自定义内核并运行它(而不是Ubuntu库存内核).
虽然这不是可以解决的问题,但坦率地说,没有人能够使用你的模块(你也需要提供修改后的内核).
将模块编译为内置模块.
它可以在内核树中完成,obj-y而不是使用obj-m).在这种情况下,您将能够使用show_mem()功能.就像第一个选项一样,此选项意味着修改内核源代码.
编写自己的show_mem()实现.
但是,我不确定这个,因为可能会发现你根本无法在可加载模块中使用此任务所需的API.实现这一点也很困难.
结论.