Linnx提供了非常丰富的网络,IO等内核API,可以很方便开发驱动模块。典型的应用程序有一个main函数,内核模块只需要一个初始化,退出函数。下面看下第一个hello world内核模块。
一. 准备环境
#uname -a 2.6.32-431.el6.x86_64 #yum -y install kernel-devel.x86_64 #开发内核必须安装对应的内核源码
二. 编码
// hello.c #include <linux/module.h> #include <linux/init.h> static int __init helloworld_init(void) { printk(KERN_ALERT "Hello world module init\n"); return 0; } static void __exit helloworld_exit(void) { printk(KERN_ALERT "Hello world module exit\n"); } module_init(helloworld_init); // 模块初始化 module_exit(helloworld_exit); // 模块退出 MODULE_LICENSE("GPL"); // 版权 MODULE_AUTHOR("kettas"); // 作者 MODULE_DESCRIPTION("Hello world Demo"); // 描述 MODULE_VERSION("1.0.1"); // 版本 MODULE_ALIAS("hello 01"); // 别名
注:内核模块为纯C代码,对代码格式要求严格,1.变量声明必须放在函数第一行,否则报ISO C90 不允许混合使用声明和代码警告。2. 无参函数声明参数要加上void,否则报函数声明不是一个原型的警告
三. 编译
#hello.ko obj-m += hello.o #指定编译模块名称,会自动寻找hello.c CURRENT_PATH:=$(shell pwd) LINUX_KERNEL:=$(shell uname -r) LINUX_KERNEL_PATH:=/usr/src/kernels/2.6.32-431.el6.x86_64/ #内核源码目录 all: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #C进入内核目录读取Makefile,M表明后回到当前目录读取Makefile clean: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
四. 运行
#modinfo helloworld.ko #查看内核模块信息 filename: hello.ko alias: Example 01 version: 1.0.1 description: Hello world Demo author: kettas license: Dual BSD/GPL srcversion: 478008C1F7974ACC15407DB depends: vermagic: 2.6.32-431.el6.x86_64 SMP mod_unload modversions #sudo inmsmod helloworld.ko #安装helloworld内核模块,此时控制台没有打印hello world #dmesg #printk日志信息会写入内核环形缓冲区内,运行dmesg可查看 hello world module init hello world module exit