/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
MAKEFILE
obj-m += hello.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
在make
命令后,我收到以下错误。这个错误的原因是什么,我该如何解决?
make -C /lib/modules/2.6.32-358.el6.x86_64/build M=/home/hello modules
make: *** /lib/modules/2.6.32-358.el6.x86_64/build: No such file or directory. Stop.
make: *** [all] Error 2
答案 0 :(得分:3)
-C选项指示将目录更改为-C提供的目录。在您的情况下,它是/lib/modules/2.6.32-358.el6.x86_64/build。但是当它尝试更改到该目录时,编译会出现“没有这样的文件或目录”的错误,这意味着您没有/lib/modules/2.6.32-358.el6.x86_64/中的构建目录。
很多时候,在给定路径中构建可能不是目录,但它可能是指向内核源代码目录的软链接。
因此,您需要检查在包含内核源的所需路径上是否应该有构建目录,或者它应该是到内核源的软链接。
答案 1 :(得分:0)
除了所有这些构建相关的注释之外,编写内核模块时必须遵循的几件事情。即使您修复了这些构建问题,您的代码也无法按预期工作。为什么?你已经构建了init和cleanup例程,但是你没有指定/指示哪一个是你的init例程,哪个是清理。
你必须这样做,
在文件末尾添加这两行。
module_init ( foo_init_fn);
module_exit ( bar_exit_fn);
此外,您必须指定模块许可证详细信息等,如下所示
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Copyright (c) 2006 by xxxx xxxxx, Inc.");
MODULE_DESCRIPTION("klm_vdc");