我已经在我的系统上构建了内核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语句有一些值。
答案 0 :(得分:0)
pDesc
和pDmaInfo
在Create_DMA()之前是非初始化的,因此它包含垃圾值,并在create_DMA调用输出一些值之前在main函数中生成print语句。
当调用Create_DMA()时,Create_DMA()尝试分配内存和其他一些资源,并将结果放在pDesc
和pDmaInfo
。当Create_DMA()失败时,pDesc
和pDmaInfo
的值未定义,取决于Create_DMA()的进程。
为避免此类问题,您应始终初始化pDesc
和pDmaInfo
并仔细编写Create_DMA()。
main()
{
....
struct DMAINFO* pDmaInfo = NULL;
struct DESC* pDesc = NULL;
....
}