免费注册 查看新帖 |

Chinaunix

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

弱问:在kernel里死循环的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-09 15:09 |只看该作者 |倒序浏览
测试环境是 linux2.4.25+单cpu+非抢占
我故意在softirq里加了一个死循环,我是在网卡收包处理流程的下半部里加的,具体的说是NET_RX_SOFTIRQ这个软中断里加的.
while(1)
    a++;

当收到一个包后,会走到死循环这个地方,并陷进去.

我碰到的问题是,按下键盘,系统没有任何响应.
我的理解是:在这个软中断处理过程里,是开中断的,既然开中断,键盘中断请求就能通过中断控制器传给cpu,
cpu在执行完当前指令后就应该来响应键盘中断请求,那系统就应该有响应.
呵呵,我的理解肯定有错,希望各位指教.

论坛徽章:
0
2 [报告]
发表于 2008-05-09 15:18 |只看该作者
原帖由 kuganlan 于 2008-5-9 15:09 发表
测试环境是 linux2.4.25+单cpu+非抢占
我故意在softirq里加了一个死循环,我是在网卡收包处理流程的下半部里加的,具体的说是NET_RX_SOFTIRQ这个软中断里加的.
while(1)
    a++;

当收到一个包后,会走到死循 ...

问题是你按下键盘期待有什么响应呢?屏幕上出现一个字符吗?
虽然我不清楚终端的打印流程,但一个收到一个键盘中断是在内核态,一个字符出现在终端应该是用户态做的吧?
如果字符出现在终端上最终会到用户态,那么由于你这个死循环的存在,它永远回不去。
更进一步的讲,一旦离开键盘中断函数的上下文,就会继续死循环。你其它有响应,除非把这些响应全放到键盘的中断处理函数中。

论坛徽章:
0
3 [报告]
发表于 2008-05-09 15:59 |只看该作者
原帖由 zx_wing 于 2008-5-9 15:18 发表

问题是你按下键盘期待有什么响应呢?屏幕上出现一个字符吗?
虽然我不清楚终端的打印流程,但一个收到一个键盘中断是在内核态,一个字符出现在终端应该是用户态做的吧?
如果字符出现在终端上最终会到用户态 ...


多谢回复.
做这个实验我主要是想确认几个问题:
1.)cpu总是会优先响应硬中断.
2.)软中断在同一个cpu上是不能并发执行的.

另外,你能有什么办法证明此时系统还是活着的吗?

论坛徽章:
0
4 [报告]
发表于 2008-05-09 16:11 |只看该作者
原帖由 kuganlan 于 2008-5-9 15:59 发表


多谢回复.
做这个实验我主要是想确认几个问题:
1.)cpu总是会优先响应硬中断.
2.)软中断在同一个cpu上是不能并发执行的.

另外,你能有什么办法证明此时系统还是活着的吗?

把你的死循环改了,加个全局变量,如下


  1. voliate int is_out;
  2. while ( is_out == 0 )
  3.    a ++;

复制代码

然后找到键盘中断的处理函数,加一句is_out = 1;

论坛徽章:
0
5 [报告]
发表于 2008-05-09 17:45 |只看该作者
原帖由 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
6 [报告]
发表于 2008-05-09 17:55 |只看该作者
原帖由 frank_seng 于 2008-5-9 17:45 发表


1.)cpu总是会优先响应硬中断.
    答:没错,当软中断正在执行时如果来了硬中断,此时会将所有寄存器现场状态保存到当前进程的内核堆栈中,随后去处理硬中断;

2.)软中断在同一个cpu上是不能并发执行的 ...

键盘没有软中断吧,linux目前只有网络和SCSI硬盘还有timer有吧

论坛徽章:
0
7 [报告]
发表于 2008-05-09 17:56 |只看该作者
原帖由 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
8 [报告]
发表于 2008-05-09 18:01 |只看该作者
原帖由 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
9 [报告]
发表于 2008-05-09 18:04 |只看该作者
原帖由 zx_wing 于 2008-5-9 18:01 发表

呵呵,对的,tasklet也可以算成软中断。
没有办法,这个就是中文和英文的翻译问题,中文里面我们一般都把soft_irq、tasklet、workqueue叫软中断没加区分。

论坛徽章:
0
10 [报告]
发表于 2008-05-09 18:31 |只看该作者
原帖由 frank_seng 于 2008-5-9 17:45 发表


1.)cpu总是会优先响应硬中断.
    答:没错,当软中断正在执行时如果来了硬中断,此时会将所有寄存器现场状态保存到当前进程的内核堆栈中,随后去处理硬中断;

2.)软中断在同一个cpu上是不能并发执行的 ...


2.)我所说的softirq在同一个cpu上是不能并发执行的,指的是串行执行,也就是说:如果有一个softirq没有执行完,这时来了一个新的softirq,这个新的softirq不会得到执行,等到老的softirq执行完后,它才可能有机会执行.这在do_softirq()里可以看到.       
3.)分析得很详细.多谢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP