windows中断请求级(IRQL)
windows是完全按照模块化设计的,那么它很重要的一个概念就是“交互”。在linux中,没有所谓的“交互”,如果非要对应一个,那么交互就是函数 调用,而windows的内核却不是这样简单。这也许就是宏内核和微内核的区别吧?windows是一个基本的c/s模式的系统,内核里面也不乏这样的例 子,到处都是c/s的影子,不信你看,到处都是xx管理器。所以如果一个模块需要一个服务,那么它就得请求一个服务
windows是完全按照模块化设计的,那么它很重要的一个概念就是“交互”。在linux中,没有所谓的“交互”,如果非要对应一个,那么交互就是函数 调用,而windows的内核却不是这样简单。这也许就是宏内核和微内核的区别吧?windows是一个基本的c/s模式的系统,内核里面也不乏这样的例 子,到处都是c/s的影子,不信你看,到处都是xx管理器。所以如果一个模块需要一个服务,那么它就得请求一个服务(消息传递?)。
windows中将硬件中断和部分系统级别的软件执行绪都抽象成中断,比如如果需要重新调度,那么就请求一个DISPATCH_LEVEL级别的中断,但 是如果当前正在执行更高级别的中断,那么这个请求将被排队。直到irql降低到DISPATCH_LEVEL之下。这就是说在 DISPATCH_LEVEL之上是不会发生线程切换的;另一个例子,考虑缺页异常,缺页异常被影射到DISPATCH_LEVEL优先级,也就是说在 DISPATCH_LEVEL之上的程序如果产生缺页中断,那么内核将崩溃。
windows的这种做法有很多优点,比如:还记得linux的自旋锁吗?在单处理器环境下,如果内核非抢占,那么什么也不做,如果内核可抢占,那么就禁 用抢占,这是linux的实现,在windows中根本没有那么复杂,实际上就是一句话就可以实现和自旋锁一样的效果,就是将cpu提升到 DISPATCH_LEVEL优先级(限于单处理器,这就禁用了抢占)。但是windows的这种做法也有弊端,就是越往上irql,就有越少的内核函数 可供使用,比如在isr里面就不能用分页内存,不能切换线程。两种系统孰好孰怀,这是很愚蠢的问题,只能说windows的实现更加自洽(少量原则决定一切),而linux实现或许更加灵活
更多推荐
所有评论(0)