使用linux 为 ubuntu 12.04 ,内核版本使用 uname -r得到3.2.0-23-generic
首先安装module-assistant
sudo apt-get install module-assistant
直接上代码
建立个文件夹
mkdir hello_printk
在其中建俩文件 一个是hello_printk.c
另外一个是 Makefile
想要了解init.h可以参考blog//filename <hello_printk.c>
#include <linux/init.h>
#include <linux/module.h>
//在linux 2.6以上版本应该都可以识别使用的。但是在linux 2.4版本下,编译会提示头文件未能加载。
#include <linux/sched.h>
//该头文件可以用于打印当前进程ID和命令名</span>
MODULE_LICENSE("Dual BSD/GPL");/*MODULE_LICENSE是用来告诉内核,该模块是采用自由许可证,如果没有这样的声明,内核在装载模块时候会抱怨一下*/
static int hello_init(void){
printk(KERN_ALERT "hello,world!\n");
printk(KERN_INFO "HELLO WORLD IS \"%s\" (pid %i)\n",current->comm,current->pid);
return 0;
}
//代码中的字符串KERN_ALERT是定义了这条消息的优先级别
static void hello_exit(void){
printk(KERN_ALERT "Goodbye,world\n");
}
module_init(hello_init);//模块初始化 将在装载该模块执行的动作
module_exit(hello_exit);//模块卸载时候执行的动作
Makefile文件如下
如果不懂makefile怎么写的话 可以参考这个blog点击打开链接
ifneq ($(KERNELRELEASE),)
obj-m:=hello_printk.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.c
endif
回到文件夹中执行编译make
编译完成后 可以切换到 root身份,因为插入模块需要root权限。获得root权限后 在hello_printk目录下可以找到 hello_printk.ko 使用命令 insmod hello_printk.ko 将模块插入,
有时候可能会因为操作系统版本问题,没有显示在屏幕上,在ubuntu 12.04版本中 该日志存在于 /var/log/kern.log中,可以使用shell命令 grep hello /var/log/kern.log 快速找到,插入模块时候的动作,
在使用rmmod hello_printk 删除该模块。
如果需要查看模块信息 可以使用
modinfo查看内核模块信息
modinfo ./hello_printk.ko
我们可以使用 uname -r来对照模块版本号和操作系统内核版本号,如果不一致,内核会拒绝加载这个模块。在文库一篇关于linux设备驱动程序学习笔记能找到相关信息:即使使用完全相同的配置文件,版本印戳还是有细小的差异的,但这足以导致模块加载的失败。
由于时间关系,今天就先到这里 blog更新时间为每个周末