我正在研究的设备驱动程序正在实现一个虚拟设备。逻辑 如下:
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套接字实现的。
有人可能会建议可能出错的地方吗? 感谢任何建议,谢谢。
标记
答案 0 :(得分:0)
“这个错误在别的地方。”
第二个设备不应与现有设备进行交互。如果register_netdev
具有现有名称,则在检测到条件并返回ndo_init
之前,首先调用-EEXIST
虚函数。也许你的init函数做了一些涉及一些全局变量的讨厌的东西。 (例如,代码是否假设有一个设备,并在初始化期间存储一个指向它的全局指针?)