the frame size of XXX bytes is larger than 1024 bytes

最近編譯時遇到的問題
找了好久
終於知道了><...
--------------------------------
簡單舉例
--------------------------------
警告
void test(void *buffer, u32 num)
{
#define VER_MV_RANGE (16)
#define VER_DISTR_RANGE (512)
#define VER_DISTR_ZERO_POINT (256)
u32 var1_[512] = {0};
u32 var2_[512] = {0};
u32 var3_[512] = {0};
TRACE("start\n");
TRACE("end\n");
}
--------------------------------
正常
u32 var1_[512] = {0};
u32 var2_[512] = {0};
u32 var3_[512] = {0};
void test(void *buffer, u32 num)
{
#define VER_MV_RANGE (16)
#define VER_DISTR_RANGE (512)
#define VER_DISTR_ZERO_POINT (256)
TRACE("start\n");
TRACE("end\n");
}

所以警告訊息應該是函式内的變數容量數目太多所造成的

原文: http://welkinchen.pixnet.net/blog/post/45342793-the-frame-size-of-xxx-bytes-is-larger-than-1024-bytes

 

 其他類似解
基本上我改傳入參數的結構SIZE 不超過 1024 就沒這個警告了

warning: the frame size of 1040 bytes is larger than 1024 bytes

 

問題描述:

       在編譯內核模塊驅動時,如果出現如下警告信息:

warning: the frame size of 1040 bytes is larger than 1024 bytes。主要是因為內核中設置了堆棧報警大小,其默認為1024bytes。我們主要將其修改為4096既可以消除告警信息。

如果解決:

1make menuconfig

2kernel hacking

3)修改warn for stack frames larger than 的數值,將其修改為4096(最好不要大過這個數值)

4)重新編譯內核模塊則不會出現如上的告警信息。

 

 

 

 

copy_from_user: Warning: the frame size of xxx bytes is larger than 1024 bytes 这个警告如何修改

 

 

linuxkernel space編程時用到了copy_from_user這個函數,在編譯的時候出現了這樣的警告:

Warning: the frame size of xxx bytes is larger than 1024 bytes

我調用copy_from_user的方法是這樣的:

copy_from_user(dest_pointer, src_buffer. n);

copy_from_user的作用就是將src_buffer的內容拷貝nbytedest_pointer這個目標地址去.

因為我當時的dest_pointer指向的結搆體的大小是1028,GCC的提示是1032是大於1024byte,

看了kernel的源碼才知道,copy_from_user這個函數是要自己8byte,16byte,32byte補齊的,1032就是8的倍數.也就是說,copy_from_user這個函數是會判斷第一個參數的類型的大小的.

對這點做了以下的測試:

1.src_buffer改為函數的返回值,-->不行

2.src_buffer再封裝2,->因為GCC在編譯的時候會將所有的函數展開,所以仍舊是無效的.

3.n這個變量改寫為常量->這個警告仍然還是會出現的.



因為之前也懷疑過是不是linuxpage size不是4k而是1k導致的這個警告,但是經過代碼的追蹤,發現page size還真就是4k,所以應該排除這個可能.那么也就是說:

copy_from_user是會判斷第一個參數的類型的大小,如果超過1k的話,就會報出一個警告,

解決的方法是:

第一個參數是自己入的,所以就不要入那么大的結搆體就可以了,如果確實取如此大的結搆體,那么你可以先1k左右的大小,入一結搆的子結搆,之后再偏移1k左右,后面的數據獲取出.

舉個例子:

我要獲取的結搆體是:

typedef struct Big

{

struct subA;
struct subB;

}_BIG;

_BIG big;

這里

sizeof(struct Big) == 2048;

sizeof(struct subA) == 1024;

sizeof(struct subB) == 1024;

你如果直接調用copy_from_user(&big, src_buffer, 2048);

那么就會出現這個警告,你可以用以下的方法來避開這個問題:

struct subA suba;

struct subB subb;

copy_from_user(&suba, src_buffer, 1024);

copy_from_user(&subb, src_buffer + 1024, 1024);

memcpy(&big, &suba, 1024);

memcpy(&big + 1024, &subb, 1024);

這是一個折衷的辦法,對一些不允許出現經過的程序而言,此法有效.

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()