//分配以太网设备描述符
1.1 struct net_device *alloc_etherdev(int sizeof_priv)
{
//设备名默认为eth%d,其中%d随系统中以太网络设备数递增
return alloc_netdev(sizeof_priv, "eth%d", ether_setup);
}
//网络设备描述符标准分配函数
// alloc_etherdev->alloc_netdev
1.2 struct net_device *alloc_netdev(int sizeof_priv, const char *name,
void (*setup)(struct net_device *))
{
void *p;
struct net_device *dev;
int alloc_size;
//对齐到32bit
alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;
alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
//kmalloc物理内存上连续
p = kmalloc(alloc_size, GFP_KERNEL);
if (!p) {
printk(KERN_ERR "alloc_dev: Unable to allocate device.\n");
return NULL;
}
memset(p, 0, alloc_size);
dev = (struct net_device *)
(((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
//在padded中保存为对齐dev到32bit浪费的字节数
//dev-padded即可找到kmalloc分配的内存起始地址
dev->padded = (char *)dev - (char *)p;
if (sizeof_priv)
dev