Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kernel 写入e1000驱动程序时内核冻结_Kernel_Drivers_Linux Kernel_Ethernet - Fatal编程技术网

Kernel 写入e1000驱动程序时内核冻结

Kernel 写入e1000驱动程序时内核冻结,kernel,drivers,linux-kernel,ethernet,Kernel,Drivers,Linux Kernel,Ethernet,我正在为e1000卡编写网络驱动程序。在执行接收部分时,我看到内核在到达netif_rxskb调用时就会冻结。在使用裸体驱动程序硬编码skb数据时,我能够重现相同的错误 请参阅下面该测试函数的代码。数据是带有IP和以太网报头的TCP数据包的数据。当我将驱动程序加载到虚拟机中时,我看到虚拟机进程占用了主机上100%以上的CPU。操作系统在此之后不响应输入。如果我对netif_rx行进行评论,它似乎运行良好 static void test_skb(void){ unsig

我正在为e1000卡编写网络驱动程序。在执行接收部分时,我看到内核在到达netif_rxskb调用时就会冻结。在使用裸体驱动程序硬编码skb数据时,我能够重现相同的错误

请参阅下面该测试函数的代码。数据是带有IP和以太网报头的TCP数据包的数据。当我将驱动程序加载到虚拟机中时,我看到虚拟机进程占用了主机上100%以上的CPU。操作系统在此之后不响应输入。如果我对netif_rx行进行评论,它似乎运行良好

static void test_skb(void){

            unsigned char t[] = {0x52,0x54,0x00,0x12,0x34,0x56,0x52,0x55,0x0a,0x00,0x02,0x02,0x08,0x00,0x45,0x00,0x00,0x2c,0x00,0x1c,0x00,0x00,0x40,0x06,0x62,0xa0,0x0a,0x00,0x02,0x02,0x0a,0x00,0x02,0x0f,0xc6,0x1a,0x1e,0xdb,0x4c,0x81,0x18,0x01,0x00,0x00,0x00,0x00,0x60,0x02,0x22,0x38,0x14,0x66,0x00,0x00,0x02,0x04,0x05,0xb4};
            int len = 58;
            struct sk_buff *skb;
            skb = dev_alloc_skb (len + 2);
            if (skb) {
               printk("Allocated skb buffer\n");
               memcpy(skb_put(skb, len), t, len);
               printk("step1\n");
               //skb_put(skb, len);
               //skb->dev = dev;
               printk("step2\n");
               //skb->protocol = eth_type_trans(skb, dev);
               skb->protocol = ETH_P_IP;
               printk("step3\n");
               skb->ip_summed = CHECKSUM_UNNECESSARY;
               printk("step4\n");
               //netif_rx (skb);
               printk("step5\n");
            }

        printk(KERN_INFO"All Done");
        if(skb){
           dev_kfree_skb(skb);
        }

}

不要释放skb。接收数据包后,网络设备将拥有skb并管理其生存期。您如何调用此函数?因为这只是为了测试,我实际上在xmit部分调用了它,而不是在receive部分。我甚至没有为这部分注册PCI设备。