1.hello.c
#include<linux/kernel.h>#include<linux/stat.h>#include<linux/moduleparam.h>#include<linux/init.h>#include<linux/module.h>static short int a=1;static int b=2;static long int c=3;static char *d="bp";static int myintArray[2]={-1,-1};static int arr_argc=0;module_param(a,short,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);MODULE_PARM_DESC(a,"a short integer");module_param(b,int ,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);MODULE_PARM_DESC(b,"an integer");module_param(c,long,S_IRUSR);MODULE_PARM_DESC(c,"a long integer");module_param(d,charp,0000);MODULE_PARM_DESC(d,"a char string");module_param_array(myintArray,int,&arr_argc,0000);MODULE_PARM_DESC(myintArray,"an array of integers");static int __initdata hellodata=3;static int __init bp_init(void){ int i; printk(KERN_ALERT "hello world\n"); printk(KERN_ALERT "a is a short integer:%d\n",a); printk(KERN_ALERT "b is a integer:%d\n",b); printk(KERN_ALERT "c is a long integer:%d\n",c); printk(KERN_ALERT "d is a string:%s\n",d); for(i=0;i<(sizeof(myintArray)/sizeof(int));i++) printk(KERN_ALERT "myintArray[%d] is %d\n",i,myintArray[i]); printk(KERN_ALERT "\nhi,this is bp %d \n",hellodata); return 0;}static void __exit bp_exit(void){ printk(KERN_ALERT "\ngoobye bp\n");}//当向内核插入模块时调用init函数module_init(bp_init);//从内核删除模块时则调用exit函数。module_exit(bp_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("by bp");MODULE_DESCRIPTION("this is test of bp");MODULE_SUPPORTED_DEVICE("testdevice");
2.Makefile
obj-m := hello.oserver-objs := hello.oKERNELDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -f *.o *.ko *.mod.c modules.* Module.*
3.输出make进行编译
(没有谬误就是失常提醒。。)
ls查看是否生成.ko等文件
4.应用insmod将模块插入内核中,应用办法:#insmod XXX.ko
sudo insmod hello.ko
5.dmesg查看内核输入
dmesg
6.应用rmmod将模块从内核中删除,应用办法:#rmmod XXX.ko
sudo rmmod hello
此时程序退出了,应用dmesg查看打印了module_exit办法: