永发信息网

编写Linux网络驱动程序需要注意些什么

答案:2  悬赏:80  手机版
解决时间 2021-03-10 12:17
编写Linux网络驱动程序需要注意些什么
最佳答案
需要共享的话,在申请的时候指明共享方式。系统提供的request_irq()调用的定义:
int request_irq(unsigned int irq,
void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
unsigned long irqflags,
const char * devname,
void *dev_id);
如果共享中断,irqflags设置SA_SHIRQ属性,这样就允许别的设备申请同一个中断。需要注意所有用到这个中断的设备在调用request_irq()都必须设置这个属性。系统在回调每个中断处理程序时,可以用dev_id这个参数找到相应的设备。系统在回调每个中断处理程序时,可以用dev_id这个参数找到相应的设备。一般dev_id就设为device结构本身。系统处理共享中断是用各自的dev_id参数依次调用每一个中断处理程序。2 硬件发送忙时的处理
主CPU的处理能力一般比网络发送要快,所以经常会遇到系统有数据要发,但上一包数据网络设备还没发送完。因为在Linux里网络设备驱动程序一般不做数据缓存,不能发送的数据都是通知系统发送不成功,所以必须要有一个机制在硬件不忙时及时通知系统接着发送下面的数据。
一般对发送忙的处理在前面设备的发送方法(hard_start_xmit)里已经描述过,即如果发送忙,置tbusy为1。处理完发送数据后,在发送结束中断里清tbusy,同时用mark_bh()调用通知系统继续发送。
但在具体实现我的驱动程序时发现,这样的处理系统好象并不能及时地知道硬件已经空闲了,即在mark_bh()以后,系统要等一段时间才会接着发送。造成发送效率很低。2M线路只有10%不到的使用率。内核版本为2.0.35。
我最后的实现是不把tbusy置1,让系统始终认为硬件空闲,但是报告发送不成功。系统会一直尝试重发。这样处理就运行正常了。但是遍循内核源码中的网络驱动程序,似乎没有这样处理的。不知道症结在哪里。
3 流量控制(flow control) 网络数据的发送和接收都需要流量控制。这些控制是在系统里实现的,不需要驱动程序做工作。每个设备数据结构里都有一个参数dev->tx_queue_len,这个参数标明发送时最多缓存的数据包。在Linux系统里以太网设备(10/100Mbps)标明发送时最多缓存的数据包。在Linux系统里以太网设备(10/100Mbps)tx_queue_len一般设置为100,串行线路(异步串口)为10。实际上如果看源码可以知道,设置了dev->tx_queue_len并不是为缓存这些数据申请了空间。这个参数只是在收到协议层的数据包时判断发送队列里的数据是不是到了tx_queue_len的限度,以决定这一包数据加不加进发送队列。发送时另一个方面的流控是更高层协议的发送窗口(TCP协议里就有发送窗口)。达到了窗口大小,高层协议就不会再发送数据。
接收流控也分两个层次。netif_rx()缓存的数据包有限制。另外高层协议也会有一个最大的等待处理的数据量。
发送和接收流控处理在net/core/dev.c的do_dev_queue_xmit()和netif_rx()中。
4 调试很多Linux的驱动程序都是编译进内核的,形成一个大的内核文件。但对调试来说,这是相当麻烦的。调试驱动程序可以用module方式加载。支持模块方式的驱动程序必须提供两个函数:int init_module(void)和void cleanup_module(void)。init_module()在加载此模块时调用,在这个函数里可以register_netdev()注册设备。init_module()返回0表示成功,返回负表示失败。cleanup_module()在驱动程序被卸载时调用,清除占用的资源,调用unregister_netdev()。
模块可以动态地加载、卸载。在2.0.xx版本里,还有kerneld自动加载模块,但是2.2.xx中已经取消了kerneld。手工加载使用insmod命令,卸载用rmmod命令,看内核中的模块用lsmod命令。
编译驱动程序用gcc,主要命令行参数-DKERNEL -DMODULE。并且作为模块加载的驱动程序,只编译成obj形式(加-c参数)。编译好的目标文放/lib/modules/2.x.xx/misc下,在启动文件里用insmod加载。
Linux内核源代码
《The Linux Kernel Hacker's Guide》by Michael K. Johnson
《Linux Kernel Module Programming Guide》by Ori Pomerantz
《Linux下的设备驱动程》by olly in BBS水木清华站
可以选择一个模板作为开始,内核源代码里有一个网络驱动程序的模板,drivers/net/skeleton.c。里面包含了驱动程序的基本内容。但这个模板是以以太网设备为对象的,以太网的处理在Linux系统里有特殊“待遇”,所以如果不是以太网设备,有些细节上要注意,主要在初始化程序里。
最后,多参照别人写的程序,听听其他开发者的经验之谈大概是最有效的帮助了。
全部回答

          unsigned long irqflags,
          const char * devname,
          void *dev_id);
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
比一个数的百分之75多0.3的数是1.8,这个数是
怎样预防脚指甲长肉里
2017中国家庭财富报告能在哪查看原文
考考各位学习的同学们!!
1GB等于多少M
阜阳哪有卖狗的?
魔兽世界盗贼和术士怎么选择
男生jj有多大
开机后为什么鼠标用力点击桌面图标多次才有反
恒大都市广场地址在哪,我要去那里办事
【双曲线焦点】双曲线的焦点公式
一篇写《我的家乡——南通》60词的英语作文
云南腾冲女孩叫男生哥代表什么意思
宫颈管息肉做什么手术
神武2 少主天宫暴力还是功耐好
推荐资讯
一首韩文歌 好像是个女组合 开头是NANANANANA
身无分文怎么快速赚钱
那晚见有人开娃娃机罐子,连续40多传承,求解
驾驶证是到期后去审还是到期前三月内审?新规
行车记录仪好几个月不用了,现在开机都开不起
河南某地的瓜农在西瓜长到八成熟时,将写着“
海贼无双3序章羁绊必杀技怎么用
长沙市城建档案馆建筑工程竣工档案主要内容及
宝骏310W什么时候上市 本月上市5/7座选择
关于下丘脑的叙述,错误的是(  )A.下丘
我们做了PFMEA,但是没有人及时更新。请教高
2019年王朝霞期末真题精编八年级英语上册人教
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?