1、报错信息:
error: the frame size of 1928 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
2、报错打印分析
(1)编译器编译内核时,发现栈帧大小是1024字节,但是栈使用是1928字节,超过了默认栈帧大小;
(2)默认编译器是报警告信息,上面报错误信息是因为在编译器选项中添加了-Wall,把警告当错误处理;
3、报错解决
3.1、报错原因分析
(1)栈内存申请过大,或者函数调用层次太深都会导致栈溢出,引起系统崩溃,在编译时会去检查栈使用大小是否超过配置的栈大小;
(2)内核编译时会通过"-Wframe-larger-than=xxx"选项,传递给编译器栈大小,当编译器检测到栈使用大于阈值时,会产生一条警告信息;
3.2、内核中指定栈大小
(1)在内核配置文件中,"CONFIG_FRAME_WARN"配置项就是配置栈大小的;
(2)可以直接修改配置文件,或者通过"make menuconfig"修改配置项;
3.3、栈大小的影响
3.3.1、栈比较大
比如栈大小使用8K
(1)优点:栈比较大,不容易导致栈溢出;
(2)缺点:浪费内存,有些时候根本用不到这么大的栈内存;并且内存是4K分页,创建一个内核栈就需要申请连续2块的4K页,内存紧张的时候,申请8K的连续内存比申请4K困难的多;
3.3.2、栈比较小
比如栈大小1K
(1)优点:节省内存,都占用不到一个4K页,创建内核栈时比较容易;
(2)缺点:因为栈比较小,容易栈溢出;
3.4解决措施
(1)修改内核配置项,把"CONFIG_FRAME_WARN"配置项改大一点;
(2)修改程序,不要超过内核配置的栈大小;
补充:目前我所接触到的内核配置,32位的系统配置的栈大小一般是1K,64位的系统栈大小一般是4K;