Linux.ChinaUnix.net
ChinaUnix
|
Linux首页
|
新闻
|
博客
|
文章
|
专栏
|
新手
|
方案
|
图书
|
下载
|
人才
|
手册
|
wiki
|
搜索
会员:
密码:
免费注册
|
忘记密码
|
会员登录
|
搜索
|
帮助
弱问:在kernel里死循环的问题
1
2
3
››
首页
»
CU论坛
»
Linux
»
汇总贴列表
»
内核源码
»
请选择您要去的论坛 ←
>新手园地
>系统管理
>网络问题
>硬件支持
>内核问题
>系统互操作专区
>中文支持
>桌面与办公
>影音娱乐
>网络工具
>编程问题
>内核源码
>CPU与编译器
>嵌入式开发
>驱动开发
>数据库应用
>服务器应用
>安全防护
>集群和虚拟机
>开源业界与评论
>贴图娱乐
>红茶馆
>文档专区
>下载共享
>Linux书友会
>Linux站务交流
===============
→ 操作系统技术交流区 ←
>BSD
>Solaris
>SCO UNIX
>HP-UX
>AIX
>IBM AS400应用论坛
>Tru64 UNIX
>IRIX
>Mac OS X
→ 行业解决方案交流区 ←
> 金融行业
> 电信行业
> 互联网行业
> 医卫行业
> 制造行业
> 信息安全
> 教育行业
> 媒体娱乐行业
> 电子政务
> 交通行业
→ 程序设计交流区 ←
>C/C++
>Shell
>Java
>Php
>Perl
>Python
>Web开发
>软件工程
>中间件技术
>GUI编程
>软件配置管理
>VOIP开发技术
→ 网管技术交流区 ←
>网络安全
>网络技术
>Cisco技术
>存储备份之家
>服务器及硬件技术
→ 数据库技术交流区 ←
>MySQL
>PostgreSQL
>Oracle
>Informix
>Sybase
>DB2
→ 应用技术专题交流区 ←
>Web服务器
>Mail服务器
>FTP服务器
>DNS服务器
>Proxy服务器
>LDAP
>VPN
>Lotus
>Samba
→ IT综合交流区 ←
>IT业界新闻与评论
>IT职业生涯
>IT培训与认证
>IT二手大厅
>IT图书与评论
→ IT人的休闲生活交流区 ←
>清茶斋
>运动地带
>快乐数码摄影
>影音文字
>English Forum
>游戏玩家
>旅游天下
>贴图娱乐
>红茶馆
>IT爱车族
→ 站务及频道交流区 ←
>站务交流
>版主会议室
>Linux站务交流
>Linux版主会议室
>博客站务交流区
>下载频道交流区
>CU活动专区
最近访问的论坛 ...
时代域名主机托管全面特惠
|
CU积分兑换详情
|
参加调查赠100积分+《Ubuntu官方指南》
|
100积分:谈谈您对校园网建设的体会
|
‹‹ 上一主题
|
下一主题 ››
[
打印
] [
订阅
] [
收藏
] [
推荐给朋友
] [
本帖文本页
]
kuganlan
侠客
UID:275595
注册:2005-6-2
最后登录: 2008-05-27
帖子:
15
精华:0
可用积分:26
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
1楼
发表于 2008-5-9 15:09
测试环境是 linux2.4.25+单cpu+非抢占
我故意在softirq里加了一个死循环,我是在网卡收包处理流程的下半部里加的,具体的说是NET_RX_SOFTIRQ这个软中断里加的.
while(1)
a++;
当收到一个包后,会走到死循环这个地方,并陷进去.
我碰到的问题是,按下键盘,系统没有任何响应.
我的理解是:在这个软中断处理过程里,是开中断的,既然开中断,键盘中断请求就能通过中断控制器传给cpu,
cpu在执行完当前指令后就应该来响应键盘中断请求,那系统就应该有响应.
呵呵,我的理解肯定有错,希望各位指教.
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
2楼
发表于 2008-5-9 15:18
QUOTE:
原帖由
kuganlan
于 2008-5-9 15:09 发表
测试环境是 linux2.4.25+单cpu+非抢占
我故意在softirq里加了一个死循环,我是在网卡收包处理流程的下半部里加的,具体的说是NET_RX_SOFTIRQ这个软中断里加的.
while(1)
a++;
当收到一个包后,会走到死循 ...
问题是你按下键盘期待有什么响应呢?屏幕上出现一个字符吗?
虽然我不清楚终端的打印流程,但一个收到一个键盘中断是在内核态,一个字符出现在终端应该是用户态做的吧?
如果字符出现在终端上最终会到用户态,那么由于你这个死循环的存在,它永远回不去。
更进一步的讲,一旦离开键盘中断函数的上下文,就会继续死循环。你其它有响应,除非把这些响应全放到键盘的中断处理函数中。
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
kuganlan
侠客
UID:275595
注册:2005-6-2
最后登录: 2008-05-27
帖子:
15
精华:0
可用积分:26
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
3楼
发表于 2008-5-9 15:59
QUOTE:
原帖由
zx_wing
于 2008-5-9 15:18 发表
问题是你按下键盘期待有什么响应呢?屏幕上出现一个字符吗?
虽然我不清楚终端的打印流程,但一个收到一个键盘中断是在内核态,一个字符出现在终端应该是用户态做的吧?
如果字符出现在终端上最终会到用户态 ...
多谢回复.
做这个实验我主要是想确认几个问题:
1.)cpu总是会优先响应硬中断.
2.)软中断在同一个cpu上是不能并发执行的.
另外,你能有什么办法证明此时系统还是活着的吗?
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
4楼
发表于 2008-5-9 16:11
QUOTE:
原帖由
kuganlan
于 2008-5-9 15:59 发表
多谢回复.
做这个实验我主要是想确认几个问题:
1.)cpu总是会优先响应硬中断.
2.)软中断在同一个cpu上是不能并发执行的.
另外,你能有什么办法证明此时系统还是活着的吗?
把你的死循环改了,加个全局变量,如下
[Copy to clipboard]
[
-
]
CODE:
voliate int is_out;
while ( is_out == 0 )
a ++;
然后找到键盘中断的处理函数,加一句is_out = 1;
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
5楼
发表于 2008-5-9 17:45
QUOTE:
原帖由
kuganlan
于 2008-5-9 15:59 发表
多谢回复.
做这个实验我主要......是活着的吗?
1.)cpu总是会优先响应硬中断.
答:没错,当软中断正在执行时如果来了硬中断,此时会将所有寄存器现场状态保存到当前进程的内核堆栈中,随后去处理硬中断;
2.)软中断在同一个cpu上是不能并发执行的.
答:同一个CPU上软中断是轮询执行的,在do_softirq中按照softirq_vec数组顺序从0元素开始顺序执行;
3.)附,对于你做的这个实验,现在分析下在你这个现象下的本质------内核及CPU的工作过程:
[ a] 当网卡收到数据包之后,处理完硬中断并进入你编写的软中断后;
[ b] 进入死循环状态。
[ c] 如果此时你敲了下键盘或者来了其他的硬中断,那么CPU收到该中断信号,会中断当前的死循环软中断处理,将当前所有的寄存器状态保存到current的内核堆栈中;
[ d] 随后进入键盘中断处理程序,当键盘硬中断处理完毕后,在键盘中断处理程序完毕之后返回前夕,内核会检查当前是否还有软中断处理没有处理完毕;
[ e] 检查没有,则执行键盘的软中断处理程序。很明显,这里刚才的收包软中断没有处理完毕,因此是有没有处理完毕的软中断的,所以中断直接退出,而不执行键盘的软中断处理程序;
[ f] 恢复所以寄存器现场,也就是回到了你刚刚死循环中被键盘硬中断时的那个点,继续执行哪个死循环,也就是回到了[ b]中......如此往复无止境;
[ g] 这样用于在屏幕上打印你输入字符信息的键盘软中断便没有机会运行,也就是看上去没有响应;
[
本帖最后由 frank_seng 于 2008-5-9 17:56 编辑
]
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
6楼
发表于 2008-5-9 17:55
QUOTE:
原帖由
frank_seng
于 2008-5-9 17:45 发表
1.)cpu总是会优先响应硬中断.
答:没错,当软中断正在执行时如果来了硬中断,此时会将所有寄存器现场状态保存到当前进程的内核堆栈中,随后去处理硬中断;
2.)软中断在同一个cpu上是不能并发执行的 ...
键盘没有软中断吧,linux目前只有网络和SCSI硬盘还有timer有吧
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
7楼
发表于 2008-5-9 17:56
QUOTE:
原帖由
zx_wing
于 2008-5-9 17:55 发表
键盘没有软中断吧,linux目前只有网络和SCSI硬盘还有timer有吧
就是tasklet啦:tasklet_schedule(&keyboard_tasklet);
static inline void tasklet_schedule(struct tasklet_struct *t)
{
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
int cpu = smp_processor_id();
unsigned long flags;
local_irq_save(flags);
t->next = tasklet_vec[cpu].list;
tasklet_vec[cpu].list = t;
__cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);
local_irq_restore(flags);
}
}
[
本帖最后由 frank_seng 于 2008-5-9 17:58 编辑
]
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
8楼
发表于 2008-5-9 18:01
QUOTE:
原帖由
frank_seng
于 2008-5-9 17:56 发表
就是tasklet啦:tasklet_schedule(&keyboard_tasklet);
static inline void tasklet_schedule(struct tasklet_struct *t)
{
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
int cpu = s ...
呵呵,对的,tasklet也可以算成软中断。
没有办法,这个就是中文和英文的翻译问题,中文里面我们一般都把soft_irq、tasklet、workqueue叫软中断没加区分。
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
9楼
发表于 2008-5-9 18:04
QUOTE:
原帖由
zx_wing
于 2008-5-9 18:01 发表
呵呵,对的,tasklet也可以算成软中断。
没有办法,这个就是中文和英文的翻译问题,中文里面我们一般都把soft_irq、tasklet、workqueue叫软中断没加区分。
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
kuganlan
侠客
UID:275595
注册:2005-6-2
最后登录: 2008-05-27
帖子:
15
精华:0
可用积分:26
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
10楼
发表于 2008-5-9 18:31
QUOTE:
原帖由
frank_seng
于 2008-5-9 17:45 发表
1.)cpu总是会优先响应硬中断.
答:没错,当软中断正在执行时如果来了硬中断,此时会将所有寄存器现场状态保存到当前进程的内核堆栈中,随后去处理硬中断;
2.)软中断在同一个cpu上是不能并发执行的 ...
2.)我所说的softirq在同一个cpu上是不能并发执行的,指的是串行执行,也就是说:如果有一个softirq没有执行完,这时来了一个新的softirq,这个新的softirq不会得到执行,等到老的softirq执行完后,它才可能有机会执行.这在do_softirq()里可以看到.
3.)分析得很详细.多谢.
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
首页
»
CU论坛
»
Linux
»
汇总贴列表
»
内核源码
»
1
2
3
››
请选择您要去的论坛 ←
>新手园地
>系统管理
>网络问题
>硬件支持
>内核问题
>系统互操作专区
>中文支持
>桌面与办公
>影音娱乐
>网络工具
>编程问题
>内核源码
>CPU与编译器
>嵌入式开发
>驱动开发
>数据库应用
>服务器应用
>安全防护
>集群和虚拟机
>开源业界与评论
>贴图娱乐
>红茶馆
>文档专区
>下载共享
>Linux书友会
>Linux站务交流
===============
→ 操作系统技术交流区 ←
>BSD
>Solaris
>SCO UNIX
>HP-UX
>AIX
>IBM AS400应用论坛
>Tru64 UNIX
>IRIX
>Mac OS X
→ 行业解决方案交流区 ←
> 金融行业
> 电信行业
> 互联网行业
> 医卫行业
> 制造行业
> 信息安全
> 教育行业
> 媒体娱乐行业
> 电子政务
> 交通行业
→ 程序设计交流区 ←
>C/C++
>Shell
>Java
>Php
>Perl
>Python
>Web开发
>软件工程
>中间件技术
>GUI编程
>软件配置管理
>VOIP开发技术
→ 网管技术交流区 ←
>网络安全
>网络技术
>Cisco技术
>存储备份之家
>服务器及硬件技术
→ 数据库技术交流区 ←
>MySQL
>PostgreSQL
>Oracle
>Informix
>Sybase
>DB2
→ 应用技术专题交流区 ←
>Web服务器
>Mail服务器
>FTP服务器
>DNS服务器
>Proxy服务器
>LDAP
>VPN
>Lotus
>Samba
→ IT综合交流区 ←
>IT业界新闻与评论
>IT职业生涯
>IT培训与认证
>IT二手大厅
>IT图书与评论
→ IT人的休闲生活交流区 ←
>清茶斋
>运动地带
>快乐数码摄影
>影音文字
>English Forum
>游戏玩家
>旅游天下
>贴图娱乐
>红茶馆
>IT爱车族
→ 站务及频道交流区 ←
>站务交流
>版主会议室
>Linux站务交流
>Linux版主会议室
>博客站务交流区
>下载频道交流区
>CU活动专区
Copyright © 2001-2008 ChinaUnix.net All Rights Reserved 联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处
京ICP证041476号
清除 Cookies
-
Linux时代
-
Archiver
-
WAP
-
TOP
Processed in 0.048202 second(s), 5 queries , Gzip enabled