免费注册 查看新帖 |

Chinaunix

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

linux 2.6中究竟是如何实现中断独立堆栈的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-27 21:29 |只看该作者 |倒序浏览
当中断发生时,CPU从tr寄存器获得tss描述符,但是这是跟任务上下文有关的,也就是说是属于当前进程的tss,从这个tss里面取出来的还不是当前进程的内核堆栈地址吗?怎么中断ISR能实现自己独立的堆栈呢?
在schedule函数的实现里面,switch_to中,会为每个进程load_esp0,也就是说tr寄存器指向的tss描述符完全是随着任务切换而变换的,但是中断是任何时候都有可能发生的啊,一旦中断发生,从哪得到中断自己用的堆栈位置呢,想不通。。。。。。。。

论坛徽章:
0
2 [报告]
发表于 2008-10-27 21:42 |只看该作者

回复 #1 acewind 的帖子

在进程描述符得thread_info的大小为8k的时候,中断直接使用当前进程的内核栈。
如果进程的thread_info的大小为4k的话,那么中断使用自己特有的栈,这中栈每个CPU有一个,存放在固定的位置。

论坛徽章:
0
3 [报告]
发表于 2008-10-27 21:43 |只看该作者
现代的OS已经不使用 tss 来进行任务切换了

论坛徽章:
0
4 [报告]
发表于 2008-10-27 21:49 |只看该作者

回复 #2 biger410 的帖子

当中断发生时,CPU硬件就必须要知道将esp切换到哪里作为新的堆栈位置了,不可能这时候再去判断是8k还是4k吧?

论坛徽章:
0
5 [报告]
发表于 2008-10-27 21:52 |只看该作者

回复 #3 mik 的帖子

linux上的确不是用tss来进行任务切换,它把任务的上下文都保存到task_struct里面了。
但是发生中断的时候,得靠硬件完成刚开始的一个环节啊,就是根据中断号在IDT表里面找到入口,然后判断是否要进行堆栈切换,需要的话,就从当前tr寄存器所指向的tss里面取得新的堆栈位置,然后切换过去,保存当前的eflags,cs:eip等

论坛徽章:
0
6 [报告]
发表于 2008-10-27 22:02 |只看该作者

回复 #4 acewind 的帖子

先使用tss中的保存的当前进程的内核栈,然后进一步判断是否需要进行堆栈切换,如果需要在把堆栈中的内容拷贝过去。

论坛徽章:
0
7 [报告]
发表于 2008-10-27 22:15 |只看该作者
找到答案了,是在do_IRQ里面通过调用execute_on_irq_stack来实现的
也就是说,当中断发生时,开始的一段还是在当前任务的内核栈中执行的,但是后来切换到了中断自己的栈


/*
* do_IRQ handles all normal device IRQ's (the special
* SMP cross-CPU interrupts have their own specific
* handlers).
*/
unsigned int do_IRQ(struct pt_regs *regs)
{
        struct pt_regs *old_regs;
        /* high bit used in ret_from_ code */
        int overflow, irq = ~regs->orig_ax;
        struct irq_desc *desc = irq_desc + irq;

        if (unlikely((unsigned)irq >= NR_IRQS)) {
                printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
                                        __func__, irq);
                BUG();
        }

        old_regs = set_irq_regs(regs);
        irq_enter();

        overflow = check_stack_overflow();

        if (!execute_on_irq_stack(overflow, desc, irq)) {
                if (unlikely(overflow))
                        print_stack_overflow();
                desc->handle_irq(irq, desc);
        }

        irq_exit();
        set_irq_regs(old_regs);
        return 1;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP