—、必备的头文件
Linux头文件位置
1、类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/module.h
#include <linux/module.h>头文件
所有的Linux 代码必须遵循GPL 协议,如果不知道Linux 的GPL 协议,去查一下资料
– 如果你不声明GPL 协议,你的模块将无法在Linux 中使用的
– MODULE_LICENSE(_license)添加遵循GPL协议,必须的!
– MODULE_AUTHOR(_author)代码作者
2、#include <linux/init.h>
– 包含初始化宏定义的头文件,代码中的函数module_init和module_exit在此文件中
– 入口函数module_init(x)
– 出口函数module_exit(x)
二、新建.c文件
module_init(hello_init);
– /*初始化函数*/
module_exit(hello_exit);
– /*卸载函数*/
声明区
– MODULE_LICENSE("Dual BSD/GPL");
– /*声明是开源的,没有内核版本限制*/
– 必须有
– MODULE_AUTHOR("TOPEET");
– /*声明作者*/
– 可有可无
static int hello_init(void){
printk(KERN_EMERG "Hello World enter!\n");
/*打印信息,KERN_EMERG表示紧急信息*/
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "Hello world exit!\n");
}
mini_linux_module.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET");
static int hello_init(void)
{
printk(KERN_EMERG "HELLO WORLD enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "HELLO WORLD exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
makefile
#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
obj-m += mini_linux_module.o
#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/hjx/work/itop-4412/iTop4412_Kernel_3.0
#当前目录变量
PWD ?= $(shell pwd)
#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:
make -C $(KDIR) M=$(PWD) modules
#make clean执行的操作是删除后缀为o的文件
clean:
rm -rf *.o
结果:
[root@iTOP-4412]# insmod mini_linux_module.ko
[ 1169.960476] HELLO WORLD enter!
[root@iTOP-4412]#
[root@iTOP-4412]#
[root@iTOP-4412]# lsmod
mini_linux_module 700 0 - Live 0xbf00c000
[root@iTOP-4412]# rmmod mini_linux_module
[ 1179.536123] HELLO WORLD exit!
三、无法卸载模块的解决办法
rmmod mini_linux_module
卸载模块的时候会弹出错误,如下
– rmmod: can't change directory to '/lib/modules': No such file or directory
提示没有'/lib/modules'目录
– 使用命令“#mkdir /lib/modules”,新建一个目录
是用rmmod命令仍然会出现如下错误:– rmmod: can't change directory to '3.0.15': No such file or directory
提示没有目录'3.0.15'– 使用命令“#mkdir /lib/modules/3.0.15”,继续建目录