你好,新年快乐,
我正在做一个内核模块。为了正确设置设备,有必要对某些参数进行数值计算。该函数运行得很好,但gcc
编译器(我使用的是kbuild)给了我警告:
warning: the frame size of 1232 bytes is larger than 1024 bytes [-Wframe-larger-than=]
如果我是对的,这意味着空间局部变量超过了编译模块的机器给定的限制。
现在有一些问题:
- 此警告是指模块、此显式函数还是此函数及其子函数所需的整个内存空间
- 这有多关键
- 我看不出有什么办法可以减少所需的内存。有什么建议可以处理这个问题吗?有什么方法吗
也许这很有帮助:计算使用64位定点算术。这个库的所有函数都是inline
函数。
提前感谢
Alex
根据@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);
}
}
到第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);
}
}