你好,新年快乐,
我正在研究内核模块。有必要对某些参数进行数值计算以正确设置设备。
该函数工作正常,但gcc
编译器(我使用kbuild)给了我警告:
warning: the frame size of 1232 bytes is larger than 1024 bytes [-Wframe-larger-than=]
如果我正确,这意味着空间局部变量超出了模块编译的机器给出的限制。
现在有一些问题:
也许它很有帮助:计算使用64位定点算术。该库的所有功能都是inline
函数。
提前致谢
亚历
根据@Tsyvarev的建议,问题可能会减少到函数中的分配,正如这个例子所示(我知道代码没有意义 - 它仅用于显示我如何声明变量在函数内部:
uint8_t getVal ( uint8_t )
{
uint64_t ar1[128] = {0};
uint64_t ar2[128] = {0};
uint8_t val;
// a much of stuff
return val;
}
void fun ( void )
{
uint64_t ar1[128] = {0};
uint64_t ar2[128] = {0};
uint8_t cnt;
for(cnt=0; cnt<128; cnt++)
{
ar1[cnt] = getVal(cnt);
ar1[cnt] = getVal(cnt);
}
}
答案 0 :(得分:1)
指向第3点:
正如建议的那样,解决方案是使用kmalloc
将数据存储到堆中,而不是堆栈。
uint8_t getVal ( uint8_t )
{
uint64_t *ar1;
uint64_t *ar2;
uint8_t val, cnt;
// allocate memory on the heap
ar1 = kmalloc(sizeof(uint64_t), 128);
ar2 = kmalloc(sizeof(uint64_t), 128);
// initialize the arrays
for(cnt=0; cnt<128; cnt++)
{
ar1[cnt] = 0;
ar2[cnt] = 0;
}
// a much of stuff
return val;
}
void fun ( void )
{
uint64_t *ar1;
uint64_t *ar2;
uint8_t cnt;
// allocate memory on the heap
ar1 = kmalloc(sizeof(uint64_t), 128);
ar2 = kmalloc(sizeof(uint64_t), 128);
// initialize the arrays
for(cnt=0; cnt<128; cnt++)
{
ar1[cnt] = 0;
ar2[cnt] = 0;
}
for(cnt=0; cnt<128; cnt++)
{
ar1[cnt] = getVal(cnt);
ar1[cnt] = getVal(cnt);
}
}