c-处理“Wframe大于”的建议-内核模块上的警告



你好,新年快乐,

我正在做一个内核模块。为了正确设置设备,有必要对某些参数进行数值计算。该函数运行得很好,但gcc编译器(我使用的是kbuild)给了我警告:

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

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

现在有一些问题:

  1. 此警告是指模块、此显式函数还是此函数及其子函数所需的整个内存空间
  2. 这有多关键
  3. 我看不出有什么办法可以减少所需的内存。有什么建议可以处理这个问题吗?有什么方法吗

也许这很有帮助:计算使用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);
  }
}

最新更新