一、网卡驱动程序框架:
app: socket-------------------------------------------------- --------------- --------------- 若干层网络协议--纯软件 --------------- ---------------hard_start_xmit|| /\ \/ || netif_rx sk_buff --------------- 硬件相关的驱动程序(要提供hard_start_xmit, 有数据时要用netif_rx上报) -------------------------------------------------- 硬件 怎么写网卡驱动程序?1. 分配一个net_device结构体2. 设置:2.1 发包函数: hard_start_xmit2.2 收到数据时(在中断处理函数里)用netif_rx上报数据2.3 其他设置3. 注册: register_netdevice测试1th/2th:1. insmod virt_net.ko2. ifconfig vnet0 3.3.3.3 ifconfig // 查看3. ping 3.3.3.3 // 成功 ping 3.3.3.4 // 死机测试DM9000C驱动程序:1. 把dm9dev9000c.c放到内核的drivers/net目录下2. 修改drivers/net/Makefile 把obj-$(CONFIG_DM9000) += dm9000.o改为obj-$(CONFIG_DM9000) += dm9dev9000c.o3. make uImage 使用新内核启动4. 使用NFS启动或ifconfig eth0 192.168.1.17ping 192.168.1.1 二、虚拟网卡测试程序1.
/* * 参考 drivers\net\cs89x0.c */#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct net_device *vnet_dev;static int virt_net_init(void){ /* 1. 分配一个net_device结构体 */ vnet_dev = alloc_netdev(0, "vnet%d", ether_setup);; /* alloc_etherdev */ /* 2. 设置 */ /* 3. 注册 */ //register_netdevice(vnet_dev); register_netdev(vnet_dev); return 0;}static void virt_net_exit(void){ unregister_netdev(vnet_dev); free_netdev(vnet_dev);}module_init(virt_net_init);module_exit(virt_net_exit);MODULE_AUTHOR("thisway.diy@163.com,17653039@qq.com");MODULE_LICENSE("GPL");
2.Makefile
KERN_DIR = /work/system/linux-2.6.22.6all: make -C $(KERN_DIR) M=`pwd` modules clean: make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.orderobj-m += virt_net.o