处理内核模块上的“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 局部变量超过了编译模块的机器给定的限制。

现在有一些问题:

  1. 此警告是否涉及模块、此显式函数或此函数及其子函数所需的全部内存space?
  2. 这有多重要?
  3. 我没有找到减少所需内存的方法。有什么建议可以解决这个问题吗?有什么方法吗?

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