环境:ubuntu 8.04
内核版本:2.6.32.59-debug
1、编写文件hello.c
#include <linux/init.h>
#include <linux/kernel.h> //printk
/*写内核驱动的时候 必须加载这个头文件,作用是动态的将模块加载到内核中去,常用的宏定义如 MODULE_LICESENCE(),MODULE_AUTHOR(),等在此文件中*/
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); //为必须选择的语句,它是模块的许可权限,如果不声明,会出现警告信息。
static int hello_init(void)
{
printk("Hello, world -- this is the kernel speaking\n"); //printk:与printfde 区别是运行于内核态,且有消息级别机制
return 0;
}
static void hello_exit(void)
{
printk("Short is the life of a kernel module\n");
}
module_init(hello_init); //入口点不再是main( )函数,而应该是module_init( 函数名 )函数
module_exit(hello_exit); //模块的卸载点指定为hello_exit函数指针
2、编写Makefile
obj-m:=hello.o
KERNELBUILD := /lib/modules/2.6.32.59-debug //本Makefile 依赖的linux内核源码路径 ,如是交叉编译时就取开发板上运行的源码路径
all:
make -C $(KERNELBUILD) M=$(shell pwd) modules //到linux源码所在的目录执行主Makefile 并当前路径传给主Makefile,告诉主Makefile执行完后返回到当前目录,执行Makefile
echo insmod ./hello.ko to turn it on
clean:
rm -rf *.o *.ko *.mod.c *order *.symvers .tmp_versions
3、在hello.c目录下make,于是当前目录出现了 hello.ko
4、insmod hello.ko
5、dmesg -C查看内核信息(由第四步产生的)
6、lsmod | grep "hello" 命令可以看到hello内核模块,如果第四步正确的话
7、rmmod hello //删除内核模块hello.ko
8、dmesg -C查看内核信息(由第七步产生)。
linux 内核模块的编写,插入,显示及卸载