Ubuntu 网络设备驱动开发指南
网络设备驱动是Linux内核中用于管理网络接口卡(NIC)的驱动程序。以下是Ubuntu环境下网络设备驱动的入门知识和开发要点。
一、网络设备驱动基础概念
1. 网络设备特点
-
面向数据包(packet)而非字节流
-
无缓存机制(直接发送/接收数据包)
-
支持多种协议(以太网、WiFi等)
2. 与字符/块设备的区别
-
不显示在/dev目录下
-
使用套接字(socket)接口而非文件操作
-
通过ifconfig/ip命令管理
二、最简单的网络设备驱动框架
#include <linux/module.h>
#include <linux/netdevice.h>
#define DRV_NAME "simple_net"
#define DRV_VERSION "1.0"
static struct net_device *simple_dev;
static int simple_open(struct net_device *dev)
{
printk(KERN_INFO "%s: device opened\n", dev->name);
netif_start_queue(dev);
return 0;
}
static int simple_release(struct net_device *dev)
{
printk(KERN_INFO "%s: device closed\n", dev->name);
netif_stop_queue(dev);
return 0;
}
static netdev_tx_t simple_xmit(struct sk_buff *skb, struct net_device *dev)
{
printk(KERN_INFO "%s: packet transmitted, len=%d\n", dev->name, skb->len);
dev_kfree_skb(skb);
return NETDEV_TX_OK;
}
static const struct net_device_ops simple_netdev_ops = {
.ndo_open = simple_open,
.ndo_stop = simple_release,
.ndo_start_xmit = simple_xmit,
};
static void simple_setup(struct net_device *dev)
{
ether_setup(dev); // 设置以太网默认参数
dev->netdev_ops = &simple_netdev_ops;
}
static int __init simple_init(void)
{
int ret;
// 1. 分配网络设备结构
simple_dev = alloc_netdev(0, DRV_NAME, NET_NAME_UNKNOWN, simple_setup);
if (!simple_dev)
return -ENOMEM;
// 2. 注册网络设备
ret = register_netdev(simple_dev);
if (ret) {
printk(KERN_ERR "%s: failed to register\n", DRV_NAME);
free_netdev(simple_dev);
return ret;
}
printk(KERN_INFO "%s: registered as %s\n", DRV_NAME, simple_dev->name);
return 0;
}
static void __exit simple_exit(void)
{
unregister_netdev(simple_dev);
free_netdev(simple_dev);
printk(KERN_INFO "%s: unregistered\n", DRV_NAME);
}
module_init(simple_init);
module_exit(simple_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Simple network device driver")