加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[一]:收发数据包的调用

发布时间:2016-01-26 10:29:51 所属栏目:Linux 来源:网络整理
导读:内核版本:Linux-2.6.34 网卡驱动:B4401 什么是NAPI NAPI是linux一套最新的处理网口数据的API,linux 2.5引入的,所以很多驱动并不支持这种操作方式。简单来说

内核版本:Linux-2.6.34

网卡驱动:B4401

什么是NAPI

NAPI是linux一套最新的处理网口数据的API,linux 2.5引入的,所以很多驱动并不支持这种操作方式。简单来说,NAPI是综合中断方式与轮询方式的技术。数据量很低与很高时,NAPI可以发挥中断方式与轮询方式的优点,性能较好。如果数据量不稳定,且说高不高说低不低,则NAPI会在两种方式切换上消耗不少时间,效率反而较低一些。

下面会用到netdev_priv()这个函数,这里先讲解下,每个网卡驱动都有自己的私有的数据,来维持网络的正常运行,而这部分私有数据放在网络设备数据后面(内存概念上),这个函数就是通过dev来取得这部分私有数据,注间这部分私有数据不在dev结构体中,而是紧接在dev内存空间后。

static inline void *netdev_priv(const struct net_device *dev)   

{   

  return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);   
       
}

弄清这个函数还得先清楚dev这个结构的分配

alloc_netdev() -> alloc_netdev_mq()   
       
struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,   

              void (*setup)(struct net_device *), unsigned int queue_count)   

{   

     ……   

     alloc_size = sizeof(struct net_device);   

     if (sizeof_priv) {   

              /* ensure 32-byte alignment of private area */   

              alloc_size = ALIGN(alloc_size, NETDEV_ALIGN);   

              alloc_size += sizeof_priv;   

     }   

     /* ensure 32-byte alignment of whole construct */

     alloc_size += NETDEV_ALIGN - 1;   

     p = kzalloc(alloc_size, GFP_KERNEL);   

     if (!p) {   

              printk(KERN_ERR "alloc_netdev: Unable to allocate device./n");   

              return NULL;
       
     }   
       
        
       
     ……….   
       
}

可以看到,dev在分配时,即在它的后面分配了private的空间,需要注意的是,这两部分都是4字节对齐的,如下图所示,padding是加入的的补齐字节:

Linux内核分析 - 网络[一]:收发数据包的调用

举个例子,假设sizeof(net_device)大小为31B,private大小45B,则实际分配空间如图所示:

Linux内核分析 - 网络[一]:收发数据包的调用

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!