Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2335371
  • 博文数量: 168
  • 博客积分: 3184
  • 博客等级: 中校
  • 技术积分: 3959
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-12 18:57
文章存档

2019年(1)

2018年(2)

2017年(3)

2016年(15)

2015年(10)

2014年(60)

2011年(1)

2010年(76)

分类: LINUX

2010-11-02 14:01:13

1. include/linux/netdevice.h
#define NETDEV_ALIGN        32
#define NETDEV_ALIGN_CONST  (NETDEV_ALIGN - 1)
static inline void *netdev_priv(struct net_device *dev)
{
    return (char *)dev + ((sizeof(struct net_device)
                    + NETDEV_ALIGN_CONST)
                & ~NETDEV_ALIGN_CONST);
}
2. net/core/dev.c
struct net_device *alloc_netdev(int sizeof_priv, const char *name,
        void (*setup)(struct net_device *))
{
    ......
    /* ensure 32-byte alignment of both the device and private area */
    alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;
    alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
    p = kzalloc(alloc_size, GFP_KERNEL);    // 对分配的内核内存清0
    ......
    if (sizeof_priv)
        dev->priv = netdev_priv(dev);
    ......
}
linux/driver/net网卡驱动程序中充满了类似这样的代码:
sturct nic *nic = netdev_priv(dev);
文件2中可以看出net_device和网卡私有数据结构是一起分配的,要想获得网卡私有数据结构的地址,文件1中的函数netdev_priv直接返回了net_device结构末端地址,也就是网卡私有数据结构的起始地址。当然其中考虑了字节对齐的问题。至于为什么不直接返回:
sturct nic *nic = dev->priv;
《Linux Devcie Drivers》中说是为了性能和灵活性方面的考虑。
阅读(2770) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-02 17:36:01

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com