我猜想在insmod时堆栈溢出

时间:2011-05-18 11:47:14

标签: linux-kernel stack-overflow ubuntu-10.10

我已经在我的系统上构建了内核2.6.35,但有一些特定的要求。我还使用相同的内核构建了一些应用程序定义的模块。我启动了内置版本,我发现它没有正常工作,因为有一些gui和其他模块缺少问题。但系统启动了,我做了一个insmod app.ko.我遇到了崩溃。我发现这是一个堆栈问题。 APP中的调用函数传递两个局部变量的地址。像int a,b;添加(& a,& b);我在传递之前检查了& a和& b的值,它仍然是非空的但是当我在调用函数中收到相同的值时,& a,& b都是NULL或一些垃圾值。我增加了堆栈大小但没有发生任何事情。当我跳过函数调用时,我可以看到许多内存分配也失败了。所以我认为这应该是内存问题。有什么我应该检查gcc选项来定义堆栈或检查堆栈溢出。对此的任何暗示都可以帮助我很多。提前致谢。我刚刚做了一些抽象的例子,因为原始的代码部分需要花费大量的时间来解释。

main()
    {

    struct DMAINFO* pDmaInfo;
    struct DESC* pDesc;
            /*  printk("The function aruguments are Desc = %p and DmaInfo %p", &pDesc, &pDmaInfo); */

    Create_DMA(&pDesc, &pDmaInfo);
    }


void Create_DMA(**ppDesc, **ppDmaInfor)
    {
    printk("The function aruguments are Desc = %p and DmaInfo %p", ppDesc, ppDmaInfo);
    }

create_DMA中的printk语句给出了NULL值,但在create_DMA调用之前main函数中的相同print语句有一些值。

1 个答案:

答案 0 :(得分:0)

pDescpDmaInfo在Create_DMA()之前是非初始化的,因此它包含垃圾值,并在create_DMA调用输出一些值之前在main函数中生成print语句。

当调用Create_DMA()时,Create_DMA()尝试分配内存和其他一些资源,并将结果放在pDescpDmaInfo。当Create_DMA()失败时,pDescpDmaInfo的值未定义,取决于Create_DMA()的进程。

为避免此类问题,您应始终初始化pDescpDmaInfo并仔细编写Create_DMA()。

main()
    {
    ....
    struct DMAINFO* pDmaInfo = NULL;
    struct DESC* pDesc = NULL;
    ....
}