Linux 内核模块编程入门
内核模块介绍
内核模块不是独立的可执行文件,但在运行时其目标文件被链接到内核中。
只有在超级用户才能加载和卸载模块。
编译内核模块需要使用 Makefile
Makefile:核心思想,是告诉编译器,头文件都在什么地方
#Makefile文件注意:假如前面的.c文件起名为first.c,那么这里的Makefile文件中的.o文
#件就要起名为first.o 只有root用户才能加载和卸载模块
obj-m:=helloworld.o #产生helloworld模块的目标文件
#目标文件 文件 要与模块名字相同
CURRENT_PATH:=$(shell pwd) #模块所在的当前路径
LINUX_KERNEL:=$(shell uname -r) #linux内核代码的当前版本
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块
#[Tab] 内核的路径 当前目录编译完放哪 表明编译的是内核模块
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理模块
驱动源码
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/module.h>
//内核模块初始化函数
static int __init lkm_init(void)
{
printk("Hello World\n");
return 0;
}
//内核模块退出函数
static void __exit lkm_exit(void)
{
printk("Goodbye\n");
}
module_init(lkm_init);
module_exit(lkm_exit);
MODULE_LICENSE("GPL");