• 网卡驱动程序之框架(一)


    一、网卡驱动程序框架:

    app:  socket
    --------------------------------------------------
               ---------------
               --------------- 若干层网络协议--纯软件
               ---------------
               ---------------
    hard_start_xmit||  /
                   /  ||  netif_rx   sk_buff
               ---------------
              硬件相关的驱动程序(要提供hard_start_xmit, 有数据时要用netif_rx上报)           
    --------------------------------------------------
                   硬件           
               
    怎么写网卡驱动程序?
    1. 分配一个net_device结构体
    2. 设置:
    2.1 发包函数: hard_start_xmit
    2.2 收到数据时(在中断处理函数里)用netif_rx上报数据
    2.3 其他设置
    3. 注册: register_netdevice


    测试1th/2th:
    1. insmod virt_net.ko
    2. 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.o
    3. make uImage
       使用新内核启动
    4.
    使用NFS启动

    ifconfig eth0 192.168.1.17
    ping 192.168.1.1   
    二、虚拟网卡测试程序

    1.

    /*
     * 参考 drivers
    etcs89x0.c
     */
    
    #include <linux/module.h>
    #include <linux/errno.h>
    #include <linux/netdevice.h>
    #include <linux/etherdevice.h>
    #include <linux/kernel.h>
    #include <linux/types.h>
    #include <linux/fcntl.h>
    #include <linux/interrupt.h>
    #include <linux/ioport.h>
    #include <linux/in.h>
    #include <linux/skbuff.h>
    #include <linux/slab.h>
    #include <linux/spinlock.h>
    #include <linux/string.h>
    #include <linux/init.h>
    #include <linux/bitops.h>
    #include <linux/delay.h>
    
    #include <asm/system.h>
    #include <asm/io.h>
    #include <asm/irq.h>
    
    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.6
    
    all:
        make -C $(KERN_DIR) M=`pwd` modules 
    
    clean:
        make -C $(KERN_DIR) M=`pwd` modules clean
        rm -rf modules.order
    
    obj-m    += virt_net.o

  • 相关阅读:
    Android Studio运行Hello World程序
    WPF,回车即是tab
    phpmyadmin上在某数据库里创建函数
    thinkphp项目部署在phpstudy里的nginx上
    《原创视频》牛腩学docker简记
    visual studio添加docker支持简记
    edge 浏览器中数字显示为链接
    JSON.net 在实体类中自定义日期的格式
    让easyui 的alert 消息框中的确定按钮支持空格键
    修复百度编辑器(UM)禁用时上传图片按钮还可点击的BUG;
  • 原文地址:https://www.cnblogs.com/liulipeng/p/3377759.html
Copyright © 2020-2023  润新知