转载复现于:
https://www.cnblogs.com/mrzhangxinjie/p/7170736.html
在此基础上进行完善补充 细节说明,
模文件
hello.c
#include <linux/init.h> /* printk() */
#include <linux/module.h> /* __init __exit */
static int __init hello_init(void) /*模块加载函数,通过insmod命令加载模块时,被自动执行*/
{
printk(KERN_INFO " Hello World enter\n");
return 0;
}
static void __exit hello_exit(void) /*模块卸载函数,当通过rmmod命令卸载时,会被自动执行*/
{
printk(KERN_INFO " Hello World exit\n ");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("dengwei"); /*模块作者,可选*/
MODULE_LICENSE("Dual BSD/GPL"); /*模块许可证明,描述内核模块的许可权限,必须*/
MODULE_DESCRIPTION("A simple Hello World Module"); /*模块说明,可选*/
MODULE_ALIAS("a simplest module"); /*模块说明,可选*/
主要包括函数hello_init、hello_exit
应用程序以main函数开头,而内核模块以一个模块初始化函数作为入口,上例为hello_init
同时需要一个卸载函数,上例为hello_exit
由于是在内核,不能调用普通的C库函数,所以我们看到的输出函数是printk
Makefile文件
makefile文件是编译链接的规则文件。
obj-m :=hello.o //目标文件
#module-objs := file1.o file.o //当模块有多个文件组成时,添加本句
KDIR :=/usr/src/linux //内核路径,根据实际情况换成自己的内核路径,嵌入式的换成嵌入式,PC机的指定PC机路径
PWD := $(shell pwd) //模块源文件路径
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
@rm -rf *.mod.*
@rm -rf .*.cmd
@rm -rf *.o
@rm -rf Module.*
clean:
rm -rf *.ko
注意,上述文件有需要修改的地方,内核路径,
编译的时候,把注释删掉。
写好上面两个文件后,进行编译链接
在目录下输入make执行即可
模块装载与卸载
lsmod 显示系统当前所有装载模块
insmod xxxxx.ko 装载指定模块
rmmod xxxxx 卸载指定模块
dmesg 当打印等级低于默认输出等级时,采用此命令查看系统日志
我们装载模块
insmod hello.ko
因为printk是打印在系统日志里,不会在控制台输出,我们有两种办法查看,首先是
dmesg
或者查看系统日志,一般存储位置是/var/log/
名称可能是syslog之类
tail /var/log/syslog
卸载模块
rmmod hello
卸载的打印好像有点小问题