日期:2014-05-16 浏览次数:20673 次
网卡是是网络中最基本的硬件之一。
在内核中,每个网络设备都一个一个net_device 结构体实例,在进行初始化完成之后,会将该结构注册到内核中。然能内核知道该结构的存在。
这会创建一个sysfs项,这,关联到该设备的对应目录中。该目录为
[root@localhost ~]# ls -l /sys/class/net 总计 0 drwxr-xr-x 3 root root 0 10-08 00:17 eth0 drwxr-xr-x 3 root root 0 10-08 00:17 lo drwxr-xr-x 4 root root 0 10-08 00:17 peth0 drwxr-xr-x 3 root root 0 10-08 00:17 sit0 drwxr-xr-x 3 root root 0 10-08 00:17 veth1 drwxr-xr-x 3 root root 0 10-08 00:17 veth2 drwxr-xr-x 3 root root 0 10-08 00:17 veth3 drwxr-xr-x 4 root root 0 10-08 00:17 vif0.0 drwxr-xr-x 3 root root 0 10-08 00:17 vif0.1 drwxr-xr-x 3 root root 0 10-08 00:17 vif0.2 drwxr-xr-x 3 root root 0 10-08 00:17 vif0.3 drwxr-xr-x 5 root root 0 10-08 00:17 xenbr0
可以看到 我虚拟机上的网络设备有以上的设备。eth0 是第一个网卡。其他的我也不知道干嘛的。
该设备不是全局的。因此也是在一个命名空间的。
所有网络设备都保存在一个单链表中。表头为dev_base.
按设备名散列。
按接口索引散列
下面我就不得不晓得linux中 最大的一个结构体数据结构。几百行代码
如下代码
/* * The DEVICE structure. * Actually, this whole structure is a big mistake. It mixes I/O * data with strictly "high-level" data, and it has to know about * almost every data structure used in the INET module. * * FIXME: cleanup struct net_device such that network protocol info * moves out. */ struct net_device { /* * This is the first field of the "visible" part of this structure * (i.e. as seen by users in the "Space.c" file). It is the name * the interface. */ char name[IFNAMSIZ]; /* * I/O specific fields * FIXME: Merge these and struct ifmap into one */ unsigned long mem_end; /* shared mem end */ unsigned long mem_start; /* shared mem start */ unsigned long base_addr; /* device I/O address */ unsigned int irq; /* device IRQ number */ /* * Some hardware also needs these fields, but they are not * part of the usual set specified in Space.c. */ unsigned char if_port; /* Selectable AUI, TP,..*/ unsigned char dma; /* DMA channel */ unsigned long state; struct net_device *next; /* The device initialization function. Called only once. */ int (*init)(struct net_device *dev); /* ------- Fields preinitialized in Space.c finish here ------- */ struct net_device *next_sched; /* Interface index. Unique device identifier */ int ifindex; int iflink; struct net_device_stats* (*get_stats)(struct net_device *dev); struct iw_statistics* (*get_wireless_stats)(struct net_device *dev); /* List of functions to handle Wireless Extensions (instead of ioctl). * See <net/iw_handler.h> for details. Jean II */ struct iw_handler_def * wireless_handlers; struct ethtool_ops *ethtool_ops; /* * This marks the end of the "visible" part of the structure. All * fields hereafter are internal to the system, and may change at * will (read: may be cleaned up at will). */ /* These may be needed for future network-power-down code. */ unsigned long trans_start; /* Time (in jiffies) of last Tx */ unsigned long last_rx; /* Time of last Rx */ unsigned short flags; /* interface flags (a la BSD) */ unsigned short gflags; unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ unsigned short unused_alignment_fixer; /* Because we need priv_flags, * and we want to be 32-bit aligned. */ unsigned mtu; /* interface MTU value */ unsigned short type; /* interface hardware type */ unsigned short hard_header_len; /* hardware hdr length */ void *priv; /* pointer to private data */ struct net_device *master; /* Pointer to master device of a group, * which this device is member of. */ /* Interface address info. */ unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address */ un