天天看点

内核模块之hello world

  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