一、框架模型
linux下设备驱动都有一套标准的结构,字符设备,块设备,网络设备都是自己的一套框架。编写驱动只需要把内核的框架搞清楚,然后照着结构填入参数,注册进内核,在应用层就可以按照标准的形式调用了。 对于网络设备而言,主要目的就是网络数据的收发,编写驱动时将linux网络设备驱动里的接口与实际网卡硬件的操作接口对应上,应用层就可以操作网卡完成网络通信了。底层驱动里编写网卡驱动与单片机一样。
这是网络设备驱动注册的一些函数:
动态分配空间
#define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
函数参数:分配的空间大小。如果自己没有定义自己的结构体,就直接填 sizeof(struct net_device)
函数返回值:执行成功返回申请的空间地址。
空间分配的函数还有一个 alloc_netdev()函数。
alloc_etherdev()是 alloc_netdev()针对以太网的"快捷"函数
注册网络设备
int register_netdev(struct net_device *dev)
函数形参:网络设备信息 struct net_device
函数返回值:执行成功返回 0。
注册网络设备示例
static struct net_device_ops netdev_ops_test= //网络设备虚拟文件操作集合
{
.ndo_open = test_ndo_open,
.ndo_stop = test_ndo_stop,
.ndo_start_xmit = ndo_start_xmit,
};
net = alloc_etherdev(sizeof(*net));
//网络设备的名称,使用 ifconfig -a 可以查看到。
strcpy(net->name,