gpt4 book ai didi

c - 处理内核模块上的 `Wframe-larger-than` 警告的建议

转载 作者:行者123 更新时间:2023-11-30 15:13:23 27 4
gpt4 key购买 nike

您好,新年快乐,

我正在开发内核模块。有必要对某些参数进行数值计算才能正确设置设备。该函数工作完美,但 gcc 编译器(我正在使用 kbuild)给了我警告:

warning: the frame size of 1232 bytes is larger than 1024 bytes [-Wframe-larger-than=]

如果我是对的,这意味着空间局部变量超出了编译模块的机器给出的限制。

现在有一些问题:

  1. 此警告是否指模块、此显式函数或此函数及其子函数所需的整个内存空间?
  2. 这有多重要?
  3. 我没有找到减少所需内存的方法。有一些建议来处理这个问题吗?有什么方法吗?

也许有帮助:计算使用 64 位定点算法。该库的所有函数都是内联函数。

提前致谢

亚历克斯

<小时/>

按照@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);
}
}

关于c - 处理内核模块上的 `Wframe-larger-than` 警告的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34659938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com