Linux下的网络设备驱动

前言​

与字符设备和块设备不同(通过应用层和驱动层指向同一个文件,通过file_operation作为两者之间的桥梁),网络设备并不对应于/dev目录下的文件,应用程序最终使用套接字完成与 网络设备的接口。因而在网络设备身上并不能体现出“一切都是文件”的思想。

Linux系统对网络设备驱动定义了4个层次,这4个层次为网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络设备与媒介层。

1)网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议是ARP,还是IP,都通 过dev_queue_xmit()函数发送数据,并通过netif_rx()函数接收数据。这一层的存在使得上层协议独立于具体的设备。

2)网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device, 该结构体是设备驱动功能层中各函数的容器。实际上,网络设备接口层从宏观上规划了具体操作硬件的设 备驱动功能层的结构。

3)设备驱动功能层的各函数是网络设备接口层net_device数据结构的具体成员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作。

4)网络设备与媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介,网络适配器被设备驱动功能层中的函数在物理上驱动。对于Linux系统而言,网络设备和媒介都可以是虚拟的。

网络协议层接口

传输层:1、通过dev_queue_xmit()函数发送该数据包/接受通过netif_rx()函数

重要的数据结构sk_buff,又被称为套接字缓冲区。当发送数据包时,Linux内核的网络处理模块必须建立一个包含要传输的数据包的sk_buff,然后将 sk_buff递交给下层,各层在sk_buff中添加不同的协议头直至交给网络设备发送。同样地,当网络设备从网 络媒介上接收到数据包后,它必须将接收到的数据转换为sk_buff数据结构并传递给上层,各层剥去相应的 协议头直至交给用户

网络设备接口层

对不同的网络设备进行统一定义,用结构体net_device来描述

net_device结构体在内核中指代一个网络设备,它定义于include/linux/netdevice.h文件中,网络设备驱动程序只需通过填充net_device的具体成员并注册net_device即可实现硬件操作函数与内核的挂接。

struct net_device{
   
    
    char name[IFNAMESIZ] ; //全局信息
    
    unsigned long mem_end ;
    unsigned long mem_start; //mem_start和mem_end分别定义了设备所使用的共享内存的起始和结束地址
    
    unsigned long base_addr; //网络设备I/O基地址
    unsigned char irq ; // 设备使用的中断号
    unsigned char if_port; // 指定多端口设备使用哪一个端口,该字段仅针对多端口设备
    unsigned char dma ;// dma指定分配给设备的DMA通道
     
    static int moxart_set_mac_address
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值