为什么导出网络设备xmit调用导致内核崩溃?

时间:2015-01-06 02:34:30

标签: c linux linux-kernel linux-device-driver

我有一个修改后的网络设备驱动程序导出其'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,但我很怀疑这是一个特定于内核版本的东西。

1 个答案:

答案 0 :(得分:2)

您将堆栈上的结构传递给寄存器函数,然后存储指向它的指针(堆栈上的副本)。一旦从register函数返回,堆栈上的结构就会被破坏。然后,您尝试通过堆栈中现在重用的空间调用函数。

stand_alone_module_register应该接受指针到一个结构(并且调用者应该传递其结构的地址)。然后可以存储指针以供以后使用。