我有一个修改后的网络设备驱动程序导出其'xmit函数。该功能暴露给另一个独立驱动程序。每次我从独立模块调用设备xmit函数时,内核崩溃。在xmit调用之前有调试打印,但它们从未显示过。
以下是我现在实施的方法。
社区标题:
struct net_dev_op {
netdev_tx_t (*xmit) (struct sk_buff * skb, struct net_device * dev);
};
在网络设备驱动程序中:
static const struct net_dev_op op = {
.xmit = dev_xmit;
};
stand_alone_module_register(op);
独立模块:
static const struct net_dev_op *ops;
int stand_alone_module_register(static const struct net_dev_op op) {
ops = &op;
}
static int someFun() {
... // code reading ethernet header and manipulating skb
ops->xmit(skb, dev); // <-- this is where it crashes
...
}
在上面的代码中,内核在调用ops-&gt; xmit函数时崩溃。我已经验证了xmit函数,ops结构,skb缓冲区和dev设备指针的指针地址。它们都不是NULL。然而,内核崩溃就像在某处遇到NULL指针一样。
那为什么会这样呢?在调用特定于设备的xmit函数之前,是否需要调用任何特定函数?在linux内核中,net device xmit函数是如何处理的?任何人都知道在哪里可以找到原始代码?我目前正在开发Ubuntu服务器14.04 LTS 3.13.0-43,但我很怀疑这是一个特定于内核版本的东西。
答案 0 :(得分:2)
您将堆栈上的结构传递给寄存器函数,然后存储指向它的指针(堆栈上的副本)。一旦从register函数返回,堆栈上的结构就会被破坏。然后,您尝试通过堆栈中现在重用的空间调用函数。
stand_alone_module_register应该接受指针到一个结构(并且调用者应该传递其结构的地址)。然后可以存储指针以供以后使用。