'net_device'中的指针已损坏

时间:2012-10-14 20:31:05

标签: linux-kernel linux-device-driver

我正在研究的设备驱动程序正在实现一个虚拟设备。逻辑 如下:

static struct net_device_ops virt_net_ops = {
  .ndo_init = virt_net_init,
  .ndo_open = virt_net_open,
  .ndo_stop = virt_net_stop,
  .ndo_do_ioctl = virt_net_ioctl,
  .ndo_get_stats    = virt_net_get_stats,
  .ndo_start_xmit   = virt_net_start_xmit,
};

...

  struct net_device *dev;
  struct my_dev *virt;

  dev = alloc_netdev(..);
  /* check for NULL */

  virt = netdev_priv(dev);

  dev->netdev_ops = &virt_net_ops;
  SET_ETHTOOL_OPS(dev, &virt_ethtool_ops);
  dev_net_set(dev, net);
  virt->magic = MY_VIRT_DEV_MAGIC;
  ret = register_netdev(dev);
  if (ret) {
     printk("register_netdev failed\n");
     free_netdev(dev);
     return ret;
  }
...

在某处某处某处指针net_device_ops会发生什么 'net_dev'被破坏了,即

1)第一次创建设备(分配net_dev,初始化字段 包括net_device_ops,即 用包含函数指针的静态结构初始化,注册 内核调用register_netdev()的设备 - 确定

2)尝试再次创建具有相同名称的设备,重复上述步骤 步骤,调用register_netdev(),它将返回负数和我们 free_netdev(dev)并将错误返回给调用者。

在这两个事件之间,指向net_device_ops的指针已经改变, 虽然代码中没有任何地方,但除了初始化之外,它是明确完成的 相。

内核版本是2.6.31.8,平台MIPS。用户空间和内核之间的通信通道是通过netlink套接字实现的。

有人可能会建议可能出错的地方吗? 感谢任何建议,谢谢。

标记

1 个答案:

答案 0 :(得分:0)

“这个错误在别的地方。”

第二个设备不应与现有设备进行交互。如果register_netdev具有现有名称,则在检测到条件并返回ndo_init之前,首先调用-EEXIST虚函数。也许你的init函数做了一些涉及一些全局变量的讨厌的东西。 (例如,代码是否假设有一个设备,并在初始化期间存储一个指向它的全局指针?)