`
网络接口
  • 浏览: 43317 次
文章分类
社区版块
存档分类
最新评论

linux下网络设备驱动简要过程

 
阅读更多

最近项目中,应用层要对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()等接口。

分享到:
评论

相关推荐

    [Linux操作系统分析与实践].Linux系列教材编写组.扫描版

    然后详细介绍字符设备、块设备和网络设备的linux驱动程序设计与实现方法。除此以外,还给出了linux系统管理、内核同步机制、进程间通信、内存管理、proc文件创建、设备驱动程序、内核裁减等实验内容及有关参考代码。...

    基于Linux的开源视频采集技术

    此毕业设计首先对Linux的相关开发环境做了介绍,而后对在Linux操作系统下的程序设计,主要是使用基于V4L(Video for Linux)技术编写设备的驱动程序和采集程序作了介绍,并利用C/C++语言进行编程。使得在Linux的环境...

    Linux内核工作原理 word版本 强烈推荐

    设备驱动程序一章将描叙Linux核心是如何控制系统中的物理设备。 文件系统一章描叙了Linux核心是如何维护它所支持的文件系统中的文件。同时还描叙了虚拟文件系统(VFS)及Linux核心的每种文件系统是如何得到支持。 ...

    Linux环境数据库管理员指南

    1.1 Linux的简要历史介绍 1 1.2 Linux核心 2 1.2.1 Linux的开发特点 2 1.2.2 Linux分发包 3 1.2.3 为什么要为商业Linux 版本付费 3 1.3 Linux与其他操作系统之间的差异 3 1.3.1 功能丰富 3 1.3.2 多任务 4 1.4 为...

    Linux操作系统基础教程

    一.Linux下的网络服务.......................................................................................................24 二.几种重要的配置文件......................................................

    基于Linux-ARM平台的3G无线设计

    研究基于USB接口的3G无线网卡的无线网络接入功能实现,包括研究Linux USB设备驱动程序、实现USB Serial设备的驱动、定制Cramfs文件系统。最后移植和配置PPP拨号程序,实现嵌入式系统通过3G无线网卡接入无线网络的...

    基于Linux-ARM平台的3G无线联网方案设计

    研究基于USB接口的3G无线网卡的无线网络接入功能实现,包括研究Linux USB设备驱动程序、实现USB Serial设备的驱动、定制Cramfs文件系统。最后移植和配置PPP拨号程序,实现嵌入式系统通过3G无线网卡接入无线网络的...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在Linux中,如果要使用硬盘、光驱等储存设备,就得先将它加载,当储存设备挂上了之后,就可以把它当成一个目录来访问。挂上一个设备使用mount命令。在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的...

    jsr80 java 访问 usb

    具有多个接口的设备可以同时被多个应用程序(或者设备驱动程序)所访问,其中每一个应用程序(或者设备驱动程序)都占据一个不同的接口。该 API 支持控制传输、批量传输和中断传输,不支持等时传输,因为等时传输用于...

    学ARM和学单片机一样简单12

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单15

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单4

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单3

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单9

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单2

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单11

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单7

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

    学ARM和学单片机一样简单5

    10、块设备-USB主设备CH375驱动编程(122分钟)(第十讲) (1)、USB驱动框架简介 (2)、CH375-hw.h、Ch375-hcd.c程序讲解 (3)、LINUX内核的配置 (4)、设备号的创建 (5)、LINUX内核的编译 (6)、...

Global site tag (gtag.js) - Google Analytics