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");
}
所以警告訊息應該是函式内的變數容量數目太多所造成的
其他類似解
基本上我改傳入參數的結構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既可以消除告警信息。
如果解決:
(1)make menuconfig
(2)kernel 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 这个警告如何修改
在linux的kernel 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的內容拷貝n個byte到dest_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這個變量改寫為常量->這個警告仍然還是會出現的.
因為之前也懷疑過是不是linux的page 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);
這是一個折衷的辦法,對一些不允許出現經過的程序而言,此法有效.