我目前正在学习如何从'Linux设备驱动程序'书中制作内核模块。我将基本示例输入如下:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, worldn");
return 0;
}
static void hello_exit(void)
{
printk("Goodbye, cruel worldn");
}
module_init(hello_init);
module_exit(hello_exit);
,我使用下面的makefile来编译上面的文件hello.c
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
当我运行make命令时,控制台输出如下所示:
make -C /lib/modules/5.13.0-40-generic/build M=/home/finlay/src/linux-drivers modules
make[1]: Entering directory '/usr/src/linux-headers-5.13.0-40-generic'
MODPOST /home/finlay/src/linux-drivers/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-5.13.0-40-generic'
由于某些原因,只创建以下文件:
- .Module.symvers.cmd
- .modules.order.cmd
- Module.symvers
- modules.order
所创建的文件似乎都不是专门关于hello.c文件的。非常奇怪的是,这个相同的文件最初是用来创建hello.ko
文件的,但是它不再工作了。你知道为什么这不起作用吗?
我现在已经找到了解决方案,我从makefile中删除了一些行,因为我认为它们是冗余的,因为我认为它们只在您直接从内核构建目录调用makefile时使用。正确的makefile如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif