利用中断进行任务切换的问题

sivolin 2014-11-15 04:37:00
有个问题不是很清楚,就是:
当A任务中利用中断,通过任务门切换到B任务进行执行,当B任务执行完之后,调用中断返回指令,返回任务A继续执行,请问此时的B任务状态需要进行保存吗?
...全文
405 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
david-yue 2014-11-25
  • 打赏
  • 举报
回复
B任务的状态不用保存
fly 100% 2014-11-17
  • 打赏
  • 举报
回复
任务有自己的栈空间
sivolin 2014-11-16
  • 打赏
  • 举报
回复
引用 5 楼 Heaven_Redsky 的回复:
我觉得LZ是在研究硬件上对于中断和任务调度的某些feature。或者在尝试自己写一个小内核。值得鼓励!鼓掌! 楼上讲的很有道理。不过,对于任务调度的时机,可能根据不同的操作系统内核设计理念就有不同的调度策略。在某些实时操作系统的早期版本里,因为内核完成的任务不同,可能只有少数几个任务在跑实时性要求非常高的活儿,对于调度的实时性要求很高,有可能会采用在中断处理中做任务切换。 当然,包括调度策略在内的很多操作系统理念,也有可能随硬件性能的大大提高而改变,而且也有可能受到了Linux和Windows的影响有所改变。比如很多实时操作系统早期根本就不对内存做页处理的,现在也都做了相应的支持。
又涨姿势了,多谢回答啊,csdn真是个好地方
sivolin 2014-11-16
  • 打赏
  • 举报
回复
引用 4 楼 binaryhead 的回复:
[quote=引用 3 楼 Heaven_Redsky 的回复:] 我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
路过,对楼主的意图分析得不错。不过个人不推荐在中断处理中做任务切换选择、执行动作,借用Windows NT内核的概念(虽然理解不一定对),CPU调度任务的时机——调度选择、执行时的(软件设定的CPU)优先级,应该低于所有硬件中断优先级,以便硬件中断得到及时响应。所有硬件中断都没有的情况下,再从容地处理DPC(那些来不及在ISR中处理的任务)队列直到其为空,之后,再做具体的任务调度。 不过最根本地还是不清楚楼主的目的,是理解现有的非实时Linux内核机制吗?还是想改造Linux内核,实现特殊目的。[/quote] 其实是对操作系统比较感兴趣,想要学习一下,并试着写个简单的内核,不过对书上讲的有些东西不是很理解~~
sivolin 2014-11-16
  • 打赏
  • 举报
回复
引用 3 楼 Heaven_Redsky 的回复:
我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
你这样相当于通过中断服务程序返回来进行任务切换,这倒是让我有了新的认识。不过我在想,一般情况下,既然可以通过jmp或者call 来调用GDT中某个任务描述符的选择子来进行任务切换,那么我可否将类似的任务描述符放在IDT中,然后通过软件中断int来进行任务切换呢?比如,我把任务B的描述符放在IDT的位移10处,然后在任务A中,调用int 10,来切换到任务B
Heaven_Redsky 2014-11-16
  • 打赏
  • 举报
回复
引用 6 楼 sivolin 的回复:
[quote=引用 3 楼 Heaven_Redsky 的回复:] 我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
你这样相当于通过中断服务程序返回来进行任务切换,这倒是让我有了新的认识。不过我在想,一般情况下,既然可以通过jmp或者call 来调用GDT中某个任务描述符的选择子来进行任务切换,那么我可否将类似的任务描述符放在IDT中,然后通过软件中断int来进行任务切换呢?比如,我把任务B的描述符放在IDT的位移10处,然后在任务A中,调用int 10,来切换到任务B[/quote] 其实任务切换的思路有很多种,你可以按照自己的思路来尝试。需要记住的一点是切换任务就是切换他们的堆栈和寄存器这些上下文。无论采用什么方法,记得切出去的还能找回来就行了。
Heaven_Redsky 2014-11-15
  • 打赏
  • 举报
回复
我觉得LZ是在研究硬件上对于中断和任务调度的某些feature。或者在尝试自己写一个小内核。值得鼓励!鼓掌! 楼上讲的很有道理。不过,对于任务调度的时机,可能根据不同的操作系统内核设计理念就有不同的调度策略。在某些实时操作系统的早期版本里,因为内核完成的任务不同,可能只有少数几个任务在跑实时性要求非常高的活儿,对于调度的实时性要求很高,有可能会采用在中断处理中做任务切换。 当然,包括调度策略在内的很多操作系统理念,也有可能随硬件性能的大大提高而改变,而且也有可能受到了Linux和Windows的影响有所改变。比如很多实时操作系统早期根本就不对内存做页处理的,现在也都做了相应的支持。
二进制脑袋 2014-11-15
  • 打赏
  • 举报
回复
引用 3 楼 Heaven_Redsky 的回复:
我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
路过,对楼主的意图分析得不错。不过个人不推荐在中断处理中做任务切换选择、执行动作,借用Windows NT内核的概念(虽然理解不一定对),CPU调度任务的时机——调度选择、执行时的(软件设定的CPU)优先级,应该低于所有硬件中断优先级,以便硬件中断得到及时响应。所有硬件中断都没有的情况下,再从容地处理DPC(那些来不及在ISR中处理的任务)队列直到其为空,之后,再做具体的任务调度。 不过最根本地还是不清楚楼主的目的,是理解现有的非实时Linux内核机制吗?还是想改造Linux内核,实现特殊目的。
Heaven_Redsky 2014-11-15
  • 打赏
  • 举报
回复
我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
sivolin 2014-11-15
  • 打赏
  • 举报
回复
引用 1 楼 Heaven_Redsky 的回复:
怎么看起来 所谓B任务像是中断服务程序?
根据中断索引号,去IDT查找,如果找到的描述符类型是任务门描述符,那就发生任务切换,书上是这么说的,只是不知道这种情况下的任务和普通的中断服务程序有何区别?
Heaven_Redsky 2014-11-15
  • 打赏
  • 举报
回复
怎么看起来 所谓B任务像是中断服务程序?

4,437

社区成员

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

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