Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5758081
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2009-03-17 21:24:54

师弟的毕业设计是内核相关的,今天问到现在实现中有一个问题,很怪异。就是在代码中一个缓冲区开100正常,开4096就挂掉了。

本来感觉很诧异,拿来代码瞧了一下,测试了一下,果不其然,系统挂掉了。

在系统挂掉的瞬间,一个名字出现在大脑中:内核栈。

kernel module代码运行在当前进程的内核态,使用的是当前进程的内核栈,内核栈的大小是多少呢?

include/asm-i386/thread_info.h THREAD_SIZE
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE            (4096)
#else
#define THREAD_SIZE             (8192)
#endif

内核配置的时候,有一个4K内核栈的选项,如果选上了,内核栈为4K;如果没有选上,内核栈是8K。

代码中一个函数,连续有两个长度为4K的buffer,系统默认的8K内核栈全部被这两个buffer占据了,进程PCB信息往哪里存储?不挂掉才怪。

解决方法:
1. 使用小一些的buffer
2. 使用kmalloc动态分配内存,不过记得在函数结束的时候释放内存
阅读(8459) | 评论(2) | 转发(2) |
给主人留下些什么吧!~~

chinaunix网友2009-03-19 13:16:39

呀!核战!

chinaunix网友2009-03-19 13:16:39

呀!核战!