Linux驱动入门_module_description

2.3、网络设备驱动

网络设备驱动是专为网卡设计的驱动模型,面向数据包的接收和发送而设计的,它并不应对于文件系统的节点。即不对应于/dev目录下的设备文件,应用程序最终用套间字socket完成与网络设备的接口。

除网络设备外,字符设备和块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open(),write(),read(),close()等即可访问字符设备和块设备。块设备比字符设备复杂,在它上面会首先建立一个磁盘/Flash文件系统,如FAT、EXT3、TAFFS、TFFS等,FAT、EXT3、TAFFS、TFF规范了文件和目录在存储介质上的组织。

三、驱动的编译和加载

Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载。

3.1、编译方式

**内部编译:**将驱动程序源码放在内核源码目录中进行编译。

**外部编译:**将驱动程序源码放在内核源码目录外进行编译。

3.2、加载方式

**静态加载:**编译进uImage中,系统启动时直接加载。

**动态加载:**编译.ko文件,动态加载驱动模块。

3.3、编译器

x86等架构使用gcc即可,arm嵌入式设备需要使用相关交叉编译工具链。

下面是内核模块的例子:

#include <linux/module.h>    //所有模块都需要的头文件 
#include <linux/init.h>      // init&exit相关宏 

static int __init hello_init (void) 
{
    printk("Hello module init\n");
    return 0; 
} 

static void __exit hello_exit (void) 
{
    printk("Hello module exit\n");
}

module_init(hello_init); 
module_exit(hello_exit);

MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("LYB");
MODULE_DESCRIPTION("test for linux driver");

分析上述程序,发现一个Linux内核模块需包含模块初始化和模块卸载函数,前者在insmod的时候运行,后者在rmmod的时候运行。初始化与卸载函数必须在宏module_init和module_exit使用前定义,否则会出现编译错误。

初始化与卸载函数必须在宏module_init和module_exit使用前定义,否则会出现编译错误。 程序中的:

MODULE_LICENSE(“GPL”)用于声明模块的许可证。

MODULE_AUTHOR:说明作者信息.。

MODULE_DESCRIPTION:对本驱动的描述。

如果要将其直接编译入Linux内核,则需要将源代码文件拷贝入Linux内核源代码的相应路径里,并修改Makefile。

模块初始化函数的任务是为以后调用模块的函数做准备,好像是模块说,:" 我在这里, 这是我能做的”。

模块的退出函数( 例子里是 hello_exit )就在模块被卸载时调用.,它好像告诉内核, "我不 再在那里了, 不要要求我做任何事了”。

这种编程的方法类似于事件驱动的编程, 但是虽然不是所有的应用程序都是事件驱动的, 每个内核模块都是。另外一个主要的不同, 在事件驱动的应用程序和内核代码之间, 是退出函数: 一个终止的应用程序可以在释放资源方面 懒惰, 或者完全不做清理工作, 但是模块的退出函数必须小心恢复每个由初始化函数建立的东西, 否则会保留一些东西直到系统重启。

编写Makerfile文件来进行编译:

KERN_DIR ?= /usr/src/linux-headers-$(shell uname -r)/        #内核源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值