快速业务通道

Linux设备驱动开发概述

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-16
= NULL)
5 {
6 struct xxx_dev *dev = req->rq_disk->private_data;
7 if (!blk_fs_request(req)) //不是文件系统请求
8 {
9 printk(KERN_NOTICE "Skip non-fs requestn");
10 end_request(req, 0);//通知请求处理失败
11 continue;
12 }
13 xxx_transfer(dev, req->sector, req->current_nr_sectors, req->buffer,
14 rq_data_dir(req)); //处理这个请求
15 end_request(req, 1); //通知成功完成这个请求
16 }

Linux网络设备驱动的结构如上图所示,其中设备驱动功能层各函数是网络设备接口层net_device 数据结构的具体成员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作.sk_buff 结构体用于表示描述网络包,它定义了对应于传输层TCP/UDP(及ICMP 和IGMP)、网络层 和和链路层协议的协议头.
Linux下编写网络设备驱动的主体工作是完成net_device结构体的填充以及成员函数的实现,底层最核心的工作是:发送数据包和接收数据包,接收数据包是由中断触发的.发送数据包函数的典型结构如下:
1 int xxx_tx(struct sk_buff *skb, struct net_device *dev)
2 {
3 int len;
4 char *data, shortpkt[ETH_ZLEN];
5 /* 获得有效数据指针和长度 */
6 data = skb->data;
7 len = skb->len;
8 if (len < ETH_ZLEN)
9 {
10 /* 如果帧长小于以太帧最小长度,补0 */
11 memset(shortpkt, 0, ETH_ZLEN);
12 memcpy(shortpkt, skb->data, skb->len);
13 len = ETH_ZLEN;
14 data = shortpkt;
15 }
16
17 dev->trans_start = jiffies; /* 记录发送时间戳 */
18
19 /* 设置硬件寄存器让硬件把数据包发送出去 */
20 xxx_hw_tx(data, len, dev);
21 ...
22 }
接收数据包的典型结构是:
1 static void xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
2 {
3 ...
4 switch (status &ISQ_EVENT_MASK)
5 {
6 case ISQ_RECEIVER_EVENT:
7 /* 获取数据包 */
8 xxx_rx(dev);
9 break;
10 /* 其他类型的中断 */
11 }
12 }
13 static void xxx_rx(struct xxx_device *dev)
14 {
15 ...
16 length = get_rev_len (...);
17 /* 分配新的套接字缓冲区 */
18 skb = dev_alloc_skb(length 2);
19
20 skb_reserve(skb, 2); /* 对齐 */
21 skb->dev = dev;
22
23 /* 读取硬件上接收到的数据 */
24 insw(ioaddr RX_FRAME_PORT, skb_put(skb, length), length >> 1);
25 if (length &1)
26 skb->data[length - 1] = inw(ioaddr RX_FRAME_PORT);
27
28 /* 获取上层协议类型 */
29 skb->protocol = eth_type_trans(skb, dev);
30
31 /*把数据包交给上层 */
32 netif_rx(skb);
33
34 /* 记录接收时间戳 */
35 dev->last_rx = jiffies;
36 ...
37 }
对于其他如MTD设备、TTY设备、I2C设备、LCD设备、音频设备、摄像头、USB设备、PCI设备等,Linux都定义了类似于网络设备驱动的复杂的层次结构,如TTY设备驱动的层次如下:

这些复杂结构的定义,加大了Linux驱动的开发门槛,同时也开发Linux驱动甚至具有了类似于使用VC 开发MFC程序的特点.
3.总结
简言之,可以得出如下等式:Linux设备驱动开发=硬件控制+Linux内核API(用于并发/同步控制、阻塞/唤醒、中断底半部调度、内存和I/O访问等)+驱动框架.等式右边的3个要素缺一不可,开发高质量的Linux驱动也势必要求工程师对这些知识有良好的掌握

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号