免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7924 | 回复: 20
打印 上一主题 下一主题

如果在内核模块中定义一个静态局部变量,该局部变量是保存在内核栈中吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-16 15:25 |只看该作者 |倒序浏览
如果在用户空间定义一个静态变量,那么该变量保存于静态数据区而不是用户栈中,但是若在一内核模块中定义一个静态变量呢?

论坛徽章:
0
2 [报告]
发表于 2008-03-17 09:25 |只看该作者
>>如果在内核模块中定义一个静态局部变量,该局部变量是保存在内核栈中吗?

当然也是静态数据区

问的有问题,内核模块是内核模块,内核栈是内核栈(一个进程一个),内核模块的静态局部变量保存在内核栈中?这么多内核栈,如何保存?

论坛徽章:
0
3 [报告]
发表于 2008-03-17 12:30 |只看该作者
原帖由 qtdszws 于 2008-3-17 09:25 发表
>>如果在内核模块中定义一个静态局部变量,该局部变量是保存在内核栈中吗?

当然也是静态数据区

问的有问题,内核模块是内核模块,内核栈是内核栈(一个进程一个),内核模块的静态局部变量保存在内核栈中 ...

个人认为module以callback方式执行,当那个进程引发了某个moudle执行,就使用哪个进程的内核栈。
没有研究过,欢迎讨论

论坛徽章:
0
4 [报告]
发表于 2008-03-17 14:50 |只看该作者
我确实对这个问题没有特别仔细的想过,但是我也感觉应该是象楼上说的一样那个用户进程调用了涉及模块的操作,模块中的变量就应该在哪个进程的内核栈中。

论坛徽章:
0
5 [报告]
发表于 2008-03-17 18:42 |只看该作者
其实我忽然想起这个问题是因为在翻精华的时候看到了http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest这个帖子,里边讨论到了static char buf[1024*8]={0};变量的大小问题,我觉得如果内核模块中的静态变量不是存放在内核栈中,则不存在该变量的值是否过大,可能会使内核栈溢出的问题

论坛徽章:
0
6 [报告]
发表于 2008-03-17 19:07 |只看该作者
原帖由 dengcainiao 于 2008-3-17 18:42 发表
其实我忽然想起这个问题是因为在翻精华的时候看到了http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest这个帖子,里边讨论到了static char buf[1024*8]={0};变 ...

请albcamus 来解释一下呢,我也没看懂他们为什么会说会放内核栈上,如果放的话,早溢出了

论坛徽章:
0
7 [报告]
发表于 2008-03-17 20:09 |只看该作者
不可能放在内核栈中的

当把模块加载时,内核会使用vmalloc,分配模块大小的区间,然后把重定向后的模块完全拷贝进这个区间
然后把执行权交给init_module的函数,就开始了。

所以它的变量都放在普通的内核态的空间里

论坛徽章:
0
8 [报告]
发表于 2008-03-17 20:29 |只看该作者
原帖由 lyl19 于 2008-3-17 20:09 发表
不可能放在内核栈中的

当把模块加载时,内核会使用vmalloc,分配模块大小的区间,然后把重定向后的模块完全拷贝进这个区间
然后把执行权交给init_module的函数,就开始了。

所以它的变量都放在普通的内核 ...

不对吧,虽然说module是relocation的,但拷贝的时候只是把数据段、代码段等拷贝过去了。
而局部变量是执行时分配空间,module被relocation的时候它们都还不存在。

论坛徽章:
0
9 [报告]
发表于 2008-03-17 20:56 |只看该作者
哦,你说的是局部变量,我看前面说的是静态变量,静态变量那就是放在.data段中。

我同意你的意见,在init_module函数中分配的局部变量,应该还是在那个进程的内核栈中

论坛徽章:
0
10 [报告]
发表于 2008-03-17 21:26 |只看该作者
原帖由 zx_wing 于 2008-3-17 20:29 发表

不对吧,虽然说module是relocation的,但拷贝的时候只是把数据段、代码段等拷贝过去了。
而局部变量是执行时分配空间,module被relocation的时候它们都还不存在。


*静态* 局部变量不是运行时分配的
重定位的时候只是决定最后他们的真实地址是在哪,就像普通.o的连接
其实决定一个变量是在哪一节是由语言和编译器/连接器决定的。如果要验证 ,printk打印一个地址,一般就能看出来函数内部的
auto和static变量相差多少
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP