/***************************************************************************************************************************
参考:《LINUX设备驱动程序》第三版
编译平台:Scientific Linux 版本6.0(Carbon) 内核Linux 2.6.32-71.el6.i686
编译器:4.3.3
****************************************************************************************************************************/
创建完整的Hello World模块:在Linux下用vi创建hello.c,填入以下代码保存
- #include <linux/init.h> /*两个专门用于模块的头文件*/
- #include <linux/module.h>
- MODULE_LICENSE("Dual BSD/GPL"); /*特殊宏,告诉内核该模块采用自由许可认证*/
- static int hello_init(void){ /*定义Hello World的初始化函数*/
- printk(KERN_ALERT "Hello , world\n"); /*printk为内核的私有打印函数*/
- /*KERN_ALERT定义消息优先级为最高级*/
- return 0;
- }
- static void hello_exit(void){ /*定义Hello World的退出函数*/
- printk(KERN_ALERT "Goodbye,cruel world\n");
-
- }
- module_init(hello_init); /*加载模块,调用函数名即可*/
- module_exit(hello_exit); /*卸载模块*/
创建Makefile
#如果已定义KERNELRELEASE说明是从内核构造系统调用,可用其内建构造语句
- ifneq ($(KERNELRELEASE),)
- obj-m := hello.o
- #否则直接从命令行调用,这时要调用内核构造系统
- else
- #找到内核源码树之后,Makefile会调用“default:目标”;此时“#make”命令会被参数化成“$(MAKE)”
- #“-C”选项指定内核源码目录;
- #“M=”项让Makefile在构造modules目标前返回模块源码目录,指向obj-m变量设定的模块,这里指向hello.o
- default:
- $(MAKE) -C /usr/src/kernels/2.6.32-71.el6.i686 M=$(shell pwd) modules
- endif
- clean:
- rm *.o *.mod.c *.symvers *.ko *.ko.unsigned *.order
注1:Makefile 文件名的"M"要大写;在Makefile中行首缩进需要用Tab键;编译时先看环境变量KERNELRELEASE 是否定义,如没定义则调用Linux内核编译build脚本。
Linux中运行加载和卸载模块:
- [root@HLinuxH Kernel]# ls
- hello.c Makefile
- [root@HLinuxH Kernel]# make
- make -C /usr/src/kernels/2.6.32-71.el6.i686 M=/opt/EmbedSky/Kernel modules
- make[1]: Entering directory `/usr/src/kernels/2.6.32-71.el6.i686'
- CC [M] /opt/EmbedSky/Kernel/hello.o
- Building modules, stage 2.
- MODPOST 1 modules
- CC /opt/EmbedSky/Kernel/hello.mod.o
- LD [M] /opt/EmbedSky/Kernel/hello.ko.unsigned
- NO SIGN [M] /opt/EmbedSky/Kernel/hello.ko
- make[1]: Leaving directory `/usr/src/kernels/2.6.32-71.el6.i686'
- [root@HLinuxH Kernel]# ls
- hello.c hello.ko.unsigned hello.mod.o Makefile Module.symvers
- hello.ko hello.mod.c hello.o modules.order
- [root@HLinuxH Kernel]# insmod hello.ko
- [root@HLinuxH Kernel]# tail /var/log/messages
- Apr 13 11:54:28 HLinuxH kernel: Hello , world
- [root@HLinuxH Kernel]# rmmod hello
- [root@HLinuxH Kernel]# tail /var/log/messages
- Apr 13 11:54:28 HLinuxH kernel: Hello , world
- Apr 13 11:54:58 HLinuxH kernel: Goodbye,cruel world
- [root@HLinuxH Kernel]#
注2:我是以root用户登录系统进行操作的,若不是管理员的话,在加载前先#su命令一下。
#insmod hello.ko 命令用于加载hello.ko模块
#rmmod hello 命令用于卸载hello模块
#tail /var/log/messages 命令用于查看输出。上图输出的部分无关信息被我删除。
阅读(1743) | 评论(1) | 转发(0) |