设为首页 收藏本站
查看: 372|回复: 0

[经验分享] linux下网络设备驱动简要过程

[复制链接]

尚未签到

发表于 2016-2-24 14:45:38 | 显示全部楼层 |阅读模式
  最近项目中,应用层要对CAN帧接收的时间戳进行记录,由于BSP中的CAN驱动是做成网络接口驱动通过socket让应用层实现收发的,所以较系统地研究了一遍linux下的网络子系统的框架,这里总结记录一下:
1.对socket的应用编程,以前主要只是简单地应用write和read进行收发,这些接口只是简单地对需要收发的数据内容进行操作,应用起来也很方便,所以就想着在数据内容里面增加时间戳数据,其实后来通过驱动的阅读,应用recvmsg接口可对一些比较复杂的附加信息进行读取,就比如时间戳信息; 但这个接口用起来还是比较复杂的,首先需要使用setsockopt对关心的附加信息进行配置,然后需要应用CMSG_DATA等宏对读取出来的msg进行分析;但是,不管如何,设备驱动的数据接收中断中都需要对接收的时间点进行记录,注意一般单独写的网卡驱动可能没做这个工作; 
2.源码路径:网络设备驱动源码一般放在./drivers/net/目录下(本文称它为接口驱动),而网络协议驱动(本文称它为协议驱动)以及网络框架源码则一般放在./net/目录下;新网卡驱动的实现应该主要集中在接口驱动和协议驱动的相关工作;
3.进一步地,在第2点描述的基础上,比如,所有的CAN接口的接口驱动都放在./drivers/net/can/目录下,包括CPU自带的CAN接口以及外接的sja1000等CAN接口;这里的驱动负责使用register_netdev()接口注册网络设备,并直接对硬件进行操作,如CAN接口的寄存器配置,数据的发送以及对接收FIFO的读取等,一般的读取会使用到中断,在中断处理函数中将FIFO中数据读到以sk_buff结构封装的内存数据对象skb中,并将这个skb通过netif_rx()发送到数据接收队列中,skb中的协议域protocol成员必须填充,比如设置成AF_INET、PF_CAN等;
4.更进一步地,第3点中描述的netif_rx中,判断是否需要加时间戳(默认不需要,如需改变,应用层可通过setsockopt接口设置SO_TIMESTAMP属性),然后启动软件中断NET_RX_SOFTIRQ,相对应的中断处理函数net_rx_action()将被启动进行接收这些数据并按相应的协议域进行处理(这个处理由后面将要讲到的协议驱动进行);
5.进一步地,在第2点描述的基础上,所有的协议驱动都放在./net/目录下,如tcp、udp以及这里的CAN_RAW协议驱动文件./net/can/raw.c;包括ISO15765的网络层协议也就是在协议栈中的这个位置;
6.更进一步地,第5步所述的协议驱动,主要负责使用proto_register()接口进行协议类型的注册,以及向上层提供的操作接口,包括数据收发处理,这里的接口最终会调用接口驱动中提供的接口;
7.为应用层提供的socket相关接口都在./net/socket.c当中,如recvmsg()、setsockopt()等接口。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-182295-1-1.html 上篇帖子: Linux的程序包管理器RPM 下篇帖子: Linux_杀死进程的N种方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表