1

看起来我的内核模块在重负载下执行了一些堆栈粉碎。我可以为内核模块使用 -fstack-check 编译选项吗?似乎该编译选项会导致编译器发出额外的代码,但不会链接到库或运行时。那是对的吗?

我有一个非常简化的内核,它做的不多。我可以在启用和不启用 slub 调试的情况下加载那个简单的内核,并且它也会在编译时加载和不加载 -fstack-check。当我开始测试我的模块时,当我使用 -fstack-check 编译选项时它开始崩溃,而仅使用 slub 调试似乎不会引发错误。

另一个问题(gcc 选项 -fstack-check 究竟如何工作?)提供了一些信息,但我无法找到在内核模块编译中使用 -fstack-check 选项的人的示例。

4

1 回答 1

0

Linux 内核内部的堆栈空间受到严重限制。用细梳检查你的代码,检查在局部变量中没有使用过多的路径,根本alloca()不允许。除此之外,内核环境很恶劣。仔细检查你的逻辑。为可能超出范围的数据添加测试,将数据跟踪到数据来源并确保它始终如您所愿。来自用户空间的数据始终是引起额外偏执的原因。

于 2013-03-22T22:33:57.233 回答