注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

内核笔记  

2016-12-23 13:07:25|  分类: Linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

4个入口,

第一种:产生外部中断

第二种:产生某个异常

第三种:系统调用

第四种:某个fork出来的子进程初次被调度

4种情况,有入口就有出口,而且这出口是唯一的。

其实最后一种:fork出来的子进程初次被调度只是第3种的一个特殊,因为这个子进程初次被调度时,它相当于从它的系统调用fork中返回,返回到ret_from_sys_call,最后意图返回到它的用户态中去。

 

中断和异常都有可能发生在内核态中,这时,它们返回ret_from_intr,判断是内核态产生的,则直接RESTORE_ALL,中断返回了IRET。如果中断和异常是发生在用户态,则它们进入内核态处理,最后肯定要意图返回到用户态去。在返回去的寸前,会去判断当前进程是否要schedule,或者处理这个进程的signal信号。而系统调用也是在用户态产生的,最后肯定也要返回到用户态。内核是提供基础服务的,每个进程需要时才进入内核态,但不会也不能在内核态中停留太久,大趋势或者说最终肯定还是要返回到该进程的用户态的,因为它的主体工作是在用户态,这也是每个进程区别与其他进程的地方,用户态才是该进程做具体的事,而内核态做的或是提供的服务对所有进程都是一样的。如果某个进程进入内核态后睡眠了,那肯定是要让出CPU,让内核调度到其他进程去的。当这个进程再度被唤醒后,它还是要意图处理完它在内核中的事,赶快返回到它的用户态中去。

 

补充,对于中断或是异常,在刚开始发生时CPU会得知,并且进行一些压栈操作,但在这之后CPU就完全不知道也不关心它们的返回了,其实CPU不关心所谓的中断或是异常的返回,只要是IRET指令,CPU就相应的出栈等操作。所以你甚至可以在根本没有产生中断的情况下,自己调用IRET,这样CPU会按你的指令执行。

Linux0.12中第一个进程就是我们自己提前模拟了一个中断产生时的栈内容,然后执行IRET,让CPUIRET相应的指令动作。

如果进程A产生中断,在后续中可能会schedule到进程B,在进程B的环境中IRET的话,还是进程B的,只有等到再次调度回进程A后,再执行进程A的后续IRET才会衔接上进程A的中断返回,这都是有可能的,而CPU本身是不关心这些内核软件层面赋予的逻辑细节的,它只按指令走就是了。

CPU来角度来看可能是: 发生中断(当时是进程A在运行) à中断处理 à(由于某种原因schedul到进程B)à发生中断(当时是进程B在运行)à中断处理à中断返回IRETà(由于某种schedul到进程C)àà(schedul到进程A) à 中断返回IRET

CPU能看到的就只是中断产生处理中断返回IRET这些,它完全不知道是进程A的中断还是进程B,是进程A的中断返回还是进程B的。

 

  评论这张
 
阅读(2)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017