(linux2.6内核)中断程序中不能进行调度疑惑

loe 2015-07-02 09:59:12
网上有好多这方面的解答,都没咋看懂,发帖子请教各位大神了
前提:
2.6内核中,有个中断栈的概念,一个cpu有两个中断栈,也就是说假设进程A发生中断,中断程序就会在指定的中断栈中运行,A与此中断的栈是独立分开的
问题(我理解的步骤):
1.A发生中断,current指向当前进程A
2.中断函数执行,此时在新的栈中执行, current此时指向A
3.任务调度,此时cpu保存硬件上下文(也就是当前中断上下文)至current指向的thread_info中,即A中,然后执行schule()函数切换到别的任务,
4.切换回任务A中
请教大家这样的话就算是有独立的中断栈,在中断中进行调度任务的话,当前硬件的ss,eip会自动被保存到current所指向的进程中,那么下回不也能在切换回来继续执行吗?
...全文
1228 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wenxy1 2017-02-22
  • 打赏
  • 举报
回复
引用 5 楼 zyx_Seven 的回复:
[quote=引用 2 楼 nswcfd 的回复:] 会在中断中进行任务调度吗?通常不是在中断返回的路径上么? 到了这时候,stack已经不是irq_stack,而是切换到irq_stack之前的栈了。

do_IRQ() //version=2.6.18, arch=i386
	irq_enter()
#ifdef 4K_STACKS
	// none irq_stack, e.g. exception stack
	call_on_stack2(__do_IRQ)	// run __do_IRQ on irq_stack
	// back in exception stack
#endif
	irq_exit()

call_on_stack2
	// ebx = new irq_stack top
	xchgl	%ebx, %esp	// switch, and save old stack in ebx
	call	__do_IRQ	// IRQ handler in irq_stack
	movl	%ebx, %esp	// restore old stack
ulk上说在中断过程中不能进行任务调度,就是不能用信号量这种锁,就是有点想不通原因[/quote] Linux 2.6及更新版本的 kernel中,信号量既可以睡眠(可以被调度)也可以被抢占,只有spin lock才可以做到以上两点。
Wenxy1 2017-02-22
  • 打赏
  • 举报
回复
这个问题,几年前就有高手讨论过,参考:http://bbs.chinaunix.net/thread-2115820-1-1.html
leeyiqun 2017-02-21
  • 打赏
  • 举报
回复
1. 执行中断的时候,内核处于中断上下文中,这时不可以睡眠,与进程没有什么瓜葛,与current宏也是不相干的,但current宏还是指向进程A。 2. 中断处理程序有自己的中断栈,每个处理器一个,大小为一页。 3. 内核处于中断处于上下文的时候,调度程序是没法运行的, 4. 中断处理程序结束返回后,内核会调用调度程序,如果这时有优先级比进程A的进程B处于就绪状态,则这时内核会执行进程B而不是进程A。
xylvyoucang 2017-01-03
  • 打赏
  • 举报
回复 1
我的理解,linux在处理中断时,只在中断模式下用sp_irq保存r0,lr,spsr,然后回到svc模式,用当前进程的栈保存中断上下文。这样来看中断就是在进程上下文执行的,调度出去是没问题的。之所以不在中断处理中调度,因为中断的设计是用来处理紧急事情的,在中断处理过程中调度,违背了这个设计理念。在中断返回时调度,还没有恢复中断现场,其实也是在中断中调用。 中断中可以调度,但中断中不能block。中断是随机的,不能确定当前对应的是哪个进程,就可能所有进程都被block,不能唤醒。
nswcfd 2015-07-20
  • 打赏
  • 举报
回复
使用信号量就有可能产生调度啊,跟中断上下文内存分配必须用GFP_ATOMIC一个道理。
神叨叨的雪 2015-07-17
  • 打赏
  • 举报
回复
引用 2 楼 nswcfd 的回复:
会在中断中进行任务调度吗?通常不是在中断返回的路径上么? 到了这时候,stack已经不是irq_stack,而是切换到irq_stack之前的栈了。

do_IRQ() //version=2.6.18, arch=i386
	irq_enter()
#ifdef 4K_STACKS
	// none irq_stack, e.g. exception stack
	call_on_stack2(__do_IRQ)	// run __do_IRQ on irq_stack
	// back in exception stack
#endif
	irq_exit()

call_on_stack2
	// ebx = new irq_stack top
	xchgl	%ebx, %esp	// switch, and save old stack in ebx
	call	__do_IRQ	// IRQ handler in irq_stack
	movl	%ebx, %esp	// restore old stack
ulk上说在中断过程中不能进行任务调度,就是不能用信号量这种锁,就是有点想不通原因
神叨叨的雪 2015-07-17
  • 打赏
  • 举报
回复
引用 3 楼 nswcfd 的回复:
也就是说,schedule的调用上下文,跟有没有独立的irq_stack无关?
我是觉得没有关系
nswcfd 2015-07-08
  • 打赏
  • 举报
回复
也就是说,schedule的调用上下文,跟有没有独立的irq_stack无关?
nswcfd 2015-07-08
  • 打赏
  • 举报
回复
会在中断中进行任务调度吗?通常不是在中断返回的路径上么? 到了这时候,stack已经不是irq_stack,而是切换到irq_stack之前的栈了。

do_IRQ() //version=2.6.18, arch=i386
	irq_enter()
#ifdef 4K_STACKS
	// none irq_stack, e.g. exception stack
	call_on_stack2(__do_IRQ)	// run __do_IRQ on irq_stack
	// back in exception stack
#endif
	irq_exit()

call_on_stack2
	// ebx = new irq_stack top
	xchgl	%ebx, %esp	// switch, and save old stack in ebx
	call	__do_IRQ	// IRQ handler in irq_stack
	movl	%ebx, %esp	// restore old stack
FightForProgrammer 2015-07-05
  • 打赏
  • 举报
回复
貌似你说的有点高深啊。不过你既然有了质疑,何不来个验证

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧