一个最简单的linux驱动程序的编译运行

一、背景知识

可装载内核模块:为了使系统功能能够更灵活的扩充,Linux支持内核的动态扩展,即在系统运行时给内核增加新的功能(即模块module)。

模块:模块(module)是一段可以被动态链接的目标代码(.ko),它可由insmod命令动态的装载并链接到正在运行的内核。链接后,它就成了内核的一部分,直到用rmmod命令解除链接并卸载。

Linux驱动程序就是一种特殊的可装载内核模块。

说明:本代码在linux2.6以上测试运行通过。linux3.*也可。本人用ubuntu12.04,linux内核版本linux3.5。

二、编译内核模块

如何由源码(.c文件)生成动态链接的目标代码(即.ko文件)?

首先写一个最简单的驱动程序源码:hello.c

#include <linux/init.h> //声明头文件

#include <linux/module.h>


//模块加载函数
static int hello_init(void)  

{

	printk(KERN_INFO " Hello World enter\n");   //系统调用打印函数,类似于用户调用的printf

	return 0;

}


//模块卸载函数
static void hello_exit(void)

{

	printk(KERN_INFO " Hello World exit\n ");

}



module_init(hello_init); //向系统注册模块加载函数


module_exit(hello_exit); //向系统注册模块卸载函数



MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); //模块作者等信息声明,可选

MODULE_LICENSE("Dual BSD/GPL"); //模块许可证声明

MODULE_DESCRIPTION("A simple Hello World Module"); //模块描述声明,可选

MODULE_ALIAS("a simplest module"); //模块别名的声明,可选


将这段程序编译为hello.ko的步骤:

1、编写makefile文件

KVERS = $(shell uname -r)    #变量KVERS为当前linux版本值

obj-m += hello.o   

default:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules    

-C后面是linux内核源码树目录,M=后面是源码目录


2、在终端下输入 cd /**/**,找到hello.c源码所在的目录


3、在终端输入 make命令。


4、如图所示即可生成hello.ko文件。


其他文件是生成的一些中间文件。


三、装载

加载:在终端输入insmod命令,模块加载完成。


注意:如果终端没有打印printk语句,在linux系统日志文件/var/log/syslog中查看。


卸载:在终端输入remmod命令。


打印信息同在日志文件中。


四、一些理论知识

模块加载函数:用宏“ module_init”指定,它返回整型值。若初始化成功则返回0,若失败则返回一个负值作为错误码。
模块卸载函数必须用宏“ module_exit”指定,无返回值。

printk用法:1、 printk(KERN_INFO "Hello, world!/n");  
                      2、printk("<6>Hello, world!/n");
第一个参数指定输出级别:分为以下八种:
1、KERN_EMERG  用于紧急消息, 常常是那些崩溃前的消息.
2、KERN_ALERT  需要立刻动作的情形.
3、KERN_CRIT 严重情况, 常常与严重的硬件或者软件失效有关.
4、KERN_ERR  用来报告错误情况; 设备驱动常常使用 KERN_ERR 来报告硬件故障.
5、KERN_WARNING 有问题的情况的警告, 这些情况自己不会引起系统的严重问题.
6、KERN_NOTICE 正常情况, 但是仍然值得注意. 在这个级别一些安全相关的情况会报告.
7、KERN_INFO 信息型消息. 在这个级别, 很多驱动在启动时打印它们发现的硬件的信息.
8、KERN_DEBUG 用作调试消息.







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值