c - 内核模块中的 Stackoverflow
问题描述
我在看一本书《Linux Kernel. Development. 第三版》。罗伯特·洛夫。
我在本书中读到的关于堆栈大小的内容:
在 x86 上,堆栈大小可在编译时配置,可以是 4KB 或 8KB。从历史上看,内核栈是两页,这通常意味着它在 32 位架构上是 8KB,在 64 位架构上是 16KB——这个大小是固定的和绝对的
我有带有 ubuntu 16.06 64 位 4.15 内核的 VM。所以我的堆栈大小应该是 16000 字节(16KB)
我尝试检查 stackoverflow 行为。我在堆栈上创建了使用超过 16000 个字节的数组。
#include <linux/module.h>
#include <linux/init.h>
int __init overflow_start(void)
{
printk(KERN_INFO "Overflow Test\n");
char array[170000] = {[0 ... 16999] = 'A'};
printk(KERN_ERR "%c\n", array[16999]);
return 0;
}
void __exit overflow_end(void)
{
printk(KERN_ERR "Test success\n");
}
module_init(overflow_start);
module_exit(overflow_end);
MODULE_LICENSE("GPL");
我认为我应该看到内核恐慌与堆栈粉碎或类似的东西,但我只看到正确的输出。为什么它不破坏堆栈?
解决方案
您还可以使数组易失,而 GCC 不会对其进行优化。
volatile char array[170000] = {[0 ... 16999] = 'A'};
推荐阅读
- php - 基于相关模型属性的 Laravel 过滤器
- ruby-on-rails - 如何按日期范围过滤并检查 Ruby on Rails 上的重叠?
- azure - 从 Azure 数据工厂将数据引入雪花
- pine-script - Pine Script Tradingview - 头寸管理、入场、止损和追踪止损的基础知识
- git - 删除所有被压扁并合并的本地分支
- reactjs - React redux 状态已更改,但在组件视图中它不会更新 UI
- python - 在 Turtle 中禁用全屏模式
- c# - 如何获取控制台应用程序输出字符串值?
- ruby-on-rails - Ruby gem 写入文件系统的权限被拒绝 @ rb_sysopen
- azure-active-directory - “自定义角色创建不支持操作 'microsoft.directory/appRoleAssignments/create'。” 为什么?