处理内核模块上的“Wframe-larger-than”警告的建议
Suggestions to handle `Wframe-larger-than`-warning on kernel module
你好,新年快乐,
我正在研究内核模块。有必要对某些参数进行数值计算以正确设置设备。
该函数运行完美,但 gcc
编译器(我使用的是 kbuild)给我警告:
warning: the frame size of 1232 bytes is larger than 1024 bytes [-Wframe-larger-than=]
如果我是对的,这意味着 space 局部变量超过了编译模块的机器给定的限制。
现在有一些问题:
- 此警告是否涉及模块、此显式函数或此函数及其子函数所需的全部内存space?
- 这有多重要?
- 我没有找到减少所需内存的方法。有什么建议可以解决这个问题吗?有什么方法吗?
也许有帮助:计算使用了 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);
}
}
指向第 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);
}
}
你好,新年快乐,
我正在研究内核模块。有必要对某些参数进行数值计算以正确设置设备。
该函数运行完美,但 gcc
编译器(我使用的是 kbuild)给我警告:
warning: the frame size of 1232 bytes is larger than 1024 bytes [-Wframe-larger-than=]
如果我是对的,这意味着 space 局部变量超过了编译模块的机器给定的限制。
现在有一些问题:
- 此警告是否涉及模块、此显式函数或此函数及其子函数所需的全部内存space?
- 这有多重要?
- 我没有找到减少所需内存的方法。有什么建议可以解决这个问题吗?有什么方法吗?
也许有帮助:计算使用了 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);
}
}
指向第 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);
}
}