我有一个修改过的网络设备驱动程序正在导出它的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->xmit函数时崩溃。我已经验证了xmit函数、ops结构、skb缓冲区和dev设备指针的指针地址。它们都不为空。然而,内核崩溃了,好像它在某个地方遇到了一个空指针。
为什么会有这种行为?在调用特定于设备的xmit函数之前,是否需要调用特定的函数?在linux内核中,如何处理网络设备xmit函数?有人知道在哪里可以找到原始代码吗?我目前正在Ubuntu服务器14.04lts 3.13.0-43上开发,尽管我严重怀疑这是一个内核版本特定的东西。

最佳答案

将堆栈上的结构传递给register函数,然后register函数存储指向它的指针(堆栈上的副本)。一旦从register函数返回,堆栈上的结构就会被破坏。然后,尝试通过堆栈上现在重用的空间调用函数。
独立模块寄存器应该接受指向a结构的指针(调用者应该传递其结构的地址)。然后就可以存储指针以备以后使用。

关于c - 为什么导出的网络设备xmit调用导致内核崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27791248/

10-08 21:35