最近项目中,应用层要对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()等接口。
- 浏览: 44882 次
相关推荐
通过以上对《Linux设备驱动》第三版的简要分析,可以看出这本书涵盖了设备驱动的基础理论、开发实践和高级技巧等多个方面,对于想要深入了解Linux内核和设备驱动开发的人来说是一本不可或缺的参考书。读者可以通过...
4. **网络协议栈**:深入剖析了TCP/IP协议在Linux内核中的实现,包括套接字接口、网络层、传输层以及网络设备驱动。 5. **设备驱动**:虽然不是主要焦点,但书中也简要介绍了设备驱动的基本原理和设计思路,为阅读...
5. **网络设备驱动**:探讨网络设备驱动的特殊性,如协议栈接口、接收和发送数据包的流程。 6. **PCI和其他总线设备驱动**:讲解如何为PCI、USB、SPI等常见总线上的设备编写驱动。 7. **文件系统**:简要介绍与...
本文主要针对希望深入了解Linux网络设备驱动的新手内核开发者。假设读者已经熟悉C语言及Linux环境下的编程。文章选择Realtek 8139作为开发对象,主要有以下两个原因: 1. **技术文档支持**:Realtek公司为这款芯片...
这两种驱动是为网络设备设计的,ECM用于模拟以太网接口,MBIM则更适用于移动宽带设备。集成这些驱动需要理解和实现CDC协议,以及处理相关的网络数据包。 **电源管理驱动集成** 电源管理驱动负责管理华为模块的功耗...
在《VxWorks下设备驱动技术研究.pdf》这个文档中,你可能会找到更多关于如何在VxWorks环境下设计和实现这些驱动的详细信息,包括VxWorks提供的驱动框架、驱动开发工具以及实际案例分析。这份资料对于想要深入学习...
Linux系统的启动过程是一个复杂但有序的系列步骤,涉及硬件初始化、操作系统加载以及系统服务的启动。下面是关于Linux系统启动过程的详细分析: 1. **开机BIOS自检**:计算机加电后,BIOS(基本输入输出系统)进行...
CAN总线驱动和网络设备驱动的编写是关键,CAN总线用于实时、可靠的数据传输,而网络设备驱动则是实现网络连接的基础。 在软件设计方面,重点在于驱动程序的开发。Linux内核驱动程序的编写涵盖了对硬件设备的初始化...
综上所述,基于嵌入式Linux的虚拟驱动程序的实现涉及到对Linux内核的理解、设备驱动编程技术、网络通信协议以及特定应用领域的知识,如压电陶瓷驱动。这种技术在自动化装置、检测技术和微电子机械系统等领域有着广泛...
- **网络设备驱动程序**:通过实例教学,学习网络接口卡驱动的编写与调试方法。 - **Linux帧缓冲驱动程序(LCD)**:教授如何为LCD显示屏编写帧缓冲驱动程序。 - **USB驱动**:介绍USB设备驱动的开发方法,包括USB主机...
然后详细介绍字符设备、块设备和网络设备的linux驱动程序设计与实现方法。除此以外,还给出了linux系统管理、内核同步机制、进程间通信、内存管理、proc文件创建、设备驱动程序、内核裁减等实验内容及有关参考代码。...
Linux内核设备驱动是...以上就是Linux内核设备驱动中关于系统调用的基本概念、实现原理以及如何在Linux内核中添加和使用新系统调用的简要介绍。理解这些知识点对于开发和调试Linux内核驱动以及优化系统性能至关重要。
在Linux 2.6.18内核版本中,协议栈源码的分析涵盖了操作系统与网络协议的基础知识,以及Linux内核的初始化过程、网络设备驱动、数据包的收发、协议处理等核心环节。书中首先介绍了Linux操作系统的基本架构,包括其...
4. 设备驱动的设计与实现过程,包括 Linux 设备驱动程序的简要介绍和数据采集模块设备驱动的设计与实现过程。 5. 基于 C/S 网络架构的远程数据采集程序对嵌入式 Linux 的实时性能的测试和论证。 本论文的研究结果 ...
论文的重点是开发数据采集模块在自行构建的嵌入式 Linux 软件环境下的设备驱动,详细描述了数据采集模块设备驱动的设计与实现过程。最后,论文通过一个基于 C/S 网络架构的远程数据采集程序对嵌入式 Linux 的实时...
这需要对Linux驱动模型有深入理解,掌握字符设备、块设备、网络设备驱动的编写方法。 5. 编译工具链:为确保编译出适合目标硬件的代码,需要配置和使用针对该平台的交叉编译工具链。比如,对于ARM平台,通常会用arm...