goter 发表于 2011-06-17 12:31

哦,才发现情景分析上软中断讲的也很好

20040925 发表于 2011-06-17 13:03

回复 10# 独孤九贱


    上半部和下半部都是驱动程序实现的吧?

独孤九贱 发表于 2011-06-17 17:21

回复独孤九贱


    上半部和下半部都是驱动程序实现的吧?
20040925 发表于 2011-06-17 13:03 http://bbs1.chinaunix.net/images/common/back.gif

不一定。
如果你的下半部处理是标准的,例如网卡,则内核已经实现了。如果不是,则需要你自己实现。这只是一种思路,其实你没有下半部也无怕谓(即将它合并到驱动中),嘿嘿!!

瀚海书香 发表于 2011-06-18 15:02

本帖最后由 瀚海书香 于 2011-06-18 15:04 编辑

回复 1# 独孤九贱
调度时机好像还有ksoftirqd内核线程。ksoftirqd的执行代码如下static int ksoftirqd(void * __bind_cpu)
{
        set_current_state(TASK_INTERRUPTIBLE);

        while (!kthread_should_stop()) {
                preempt_disable();
                if (!local_softirq_pending()) {
                        preempt_enable_no_resched();
                        schedule();
                        preempt_disable();
                }

                __set_current_state(TASK_RUNNING);

                while (local_softirq_pending()) {
                        /* Preempt disable stops cpu going offline.
                           If already offline, we'll be on wrong CPU:
                           don't process */
                        if (cpu_is_offline((long)__bind_cpu))
                                goto wait_to_die;
                        do_softirq();
                        preempt_enable_no_resched();
                        cond_resched();
                        preempt_disable();
                }
                preempt_enable();
                set_current_state(TASK_INTERRUPTIBLE);
        }
        __set_current_state(TASK_RUNNING);
        return 0;

wait_to_die:
        preempt_enable();
        /* Wait for kthread_stop */
        set_current_state(TASK_INTERRUPTIBLE);
        while (!kthread_should_stop()) {
                schedule();
                set_current_state(TASK_INTERRUPTIBLE);
        }
        __set_current_state(TASK_RUNNING);
        return 0;
}

独孤九贱 发表于 2011-06-18 22:30

回复独孤九贱
调度时机好像还有ksoftirqd内核线程。ksoftirqd的执行代码如下
瀚海书香 发表于 2011-06-18 15:02 http://bbs.chinaunix.net/images/common/back.gif

哈哈,是的,ksoftirqd是方式之一,不过你没有仔细看我的贴子,原文是“是的,除了raise_softirq在,可能会(嗯,重要的是“可能”)通过wakeup_softirqd唤醒ksoftirqd外,还得明白软中断的其它调用时机。”:em02:

smalloc 发表于 2011-06-18 22:48

回复 11# goter


    为什么是才发现?

goter 发表于 2011-07-03 22:56

回复 16# smalloc


    因为之前没大看懂,哈哈

kitiz 发表于 2011-09-09 10:07

1.2 激活

当需要调用软中断时,需要调用raise_softirq函数激活软中断,这里使用术语“激活”而非“调用”,
是因为在很多情况下不能直接调用软中断。所以只能快速地将其标志为“可执行”,等待未来某一时刻调用。


菜鸟请教一个问题。
上面一段话中所以只能快速地将其标志为“可执行”,等待未来某一时刻调用等待未来某一时刻,后文中分析了4种情况,如果这个时刻还是因为其它的某些原因迟迟不来的话,这样在网络中实时性岂不是很差,求解释
迟迟不来可以认为是很少发生的情况,但是如果是不可预知的,也很恐怖啊

kgatheko 发表于 2011-09-11 00:22

赞,好文!

q631951221 发表于 2011-10-12 13:49

谢谢了,看了你的文章思路清晰多了 呵呵,在研究一下代码
页: 1 [2] 3 4
查看完整版本: 浅析Linux的软中断的实现