内核模块介绍

内核模块不是独立的可执行文件,但在运行时其目标文件被链接到内核中。

只有在超级用户才能加载和卸载模块。

编译内核模块需要使用 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");

相关

Linux 应用程序与内核程序的区别