  | 
					  | 
					  |  
					
					
	
    
 | 
                  
                    | 
                    | 					
				  
				            
					            
						            
							            
								            | 
									            
								             | 
            								
								            
									            
	Windows内核调试
	帖子发起人: kkindof   发起时间: 2013-08-20 16:41 下午   回复: 9
	
	
 
 
	 
		
			
				
					
						
							
							   
							
   
							
							
						 | 
						
						    
						      
						        | 
							          帖子排序: 
							            
						         | 
						        
							          
							          
						         | 
						       
						     
						 | 
					 
				 
			 | 
		 
	 
	
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-20, 16:41 下午
                        
											 | 
										 
										
											
												
													 
													
														kkindof
													
													
														 
														
  
														 注册: 2011-11-10
														
														 发 贴: 15
														
													
											  | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	| 
																		
关于IRQL 
 
 在XP上raise irql的时候,只是把irql写到apic寄存器中(映射到0FFFE0080h,对这个地址的写会引发中断),并没用到pcr->irql字段(求证) 
 
 而WIN7,WIN8在raise的时候就使用到了pcr->irql这个字段 这里就引出一个问题: pcr是CPU相关的,如果线程A提升到apc_level后,被线程B抢占进来,此时的pcr->irql还是保存着apc_level吗? 如果不是,在线程B切进来的时候怎么保证pcr->irql是正确的值?? 
 
 
 
 对于APC来说,APC应该是线程相关的,而MS文档上提到raise irql提升到APC LEVEL可以禁止APC deliver(包括special kernel apc) 但由于raise irql 只是修改当前cpu的,而线程是有可能切换任意procesor上运行,这样的话,那怎么禁止apc deliver呢?? 
 
 
 
 
  
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-20, 22:36 下午
                        
											 | 
										 
										
											
												
													 
													
														格蠹老雷
													
													
														 
														
  
														 注册: 2005-12-19
														
														 发 贴: 1,303
														
													
												 
											 | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	| 
																		
 如果CPU已经在APC_LEVEL,那么它只可能处理比APC_LEVEL更高优先级的,DPC,中断之类的,不可能去执行线程B的。 
处理中断并不切线程,中断处理好了,还是回到线程A的APC... 
  
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
		
			
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-23, 10:38 上午
                        
											 | 
										 
										
											
												
													 
													
														kkindof
													
													
														 
														
  
														 注册: 2011-11-10
														
														 发 贴: 15
														
													
											  | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
OK,就按上面的说法,不能换到其它低于APC level的线程,如此说来应该有线程相关的变量存放着对应的线程的irql了?否则何来比较线程A和线程B的irql?但irql又应该是processor级别的,乱了。
 
 
 暂且不说上面的。 
 
 WINDOWS下是抢占式的系统,我的理解,这是靠时钟中断,然后计算线程的时间片,强制把时间片到期的线程切到等待状态,然后把NextThread切进去执行。 按张老师你的说法假如那个到期的线程(所处的cpu)是在APC级别上,然后就不切NextThread了?? 
 
 
 
 感觉这里还有点混乱,Apc_level  disable apc delivery,可apc delivery是线程级别,而Apc_level算CPU级别的吧?按理解apc_level不是cpu级别的吧,只是MS抽象的一个概念。。"曾经也在OSR的帖子上说,使用fastmute提高irql到apc_level的话,需要和各个processor交互,效率不好" 
 
 
 
 理解得还不是很透彻,要是方便的话,张老师帮忙梳理下。。。 
 
 
 
 
  
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-26, 15:06 下午
                        
											 | 
										 
										
											
												
													 
													
														WillingBug163
													
													
														 
														
  
														 注册: 2013-08-19
														
														 发 贴: 14
														
													
												 
											 | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	
																		
你的这个问题和CPU的中断控制器相关,提升级别的同时也在屏蔽部分中断。在64位win7里面对级别的提升操作的是CR8这个寄存器,在文档中可以看到对它的设置,会影响PPR寄存器。如果提升到APC级别那么就屏蔽了特权>=1以下的中断,2号中断正好是你所说的线程任务切换用的。如果不恢复回去那么便不会在这个处理器上进行任务切换了。这也许便是文档中强调一定要再切回原来的级别。32位CPU中没有CR8,但我没有找到它操作PCR->IRQL的代码。但想必是一样的。张老师,不知道我说的对不对。呵呵。
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-28, 08:38 上午
                        
											 | 
										 
										
											
												
													 
													
														格蠹老雷
													
													
														 
														
  
														 注册: 2005-12-19
														
														 发 贴: 1,303
														
													
											  | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
																
																	| 
																		
 IRQL一定是CPU的属性,Svr 2K3之前,就是记录在CPU的APIC中,2K3新增软件字段,主要是为了支持调试。 
CPU在执行线程时,这个线程可以提升IRQL,所以有时也就混同来说线程某某的IRQL,其实是指这个线程在CPU的某一级IRQL执行(只用IRQL为0时才是执行自己的普通代码,其它时候都是“免费提供场地”被借用来执行特殊任务去了)。 
对于APC,有一点特别容易误解的地方,就是APC任务有多种类型,Kernel Special,Kernel Normal,User  Normal,并不是所有这些类型的任务都是在APC_LEVEL执行的,User Normal的APC就是在PASSIVE(0)IRQL执行的。 
这样的问题值得深究,但是三言两语很难说清,这几天会找个时间写篇博客,用调试的方法,再举些例子... 
  
																		 
																	 | 
																 
															 
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-28, 10:08 上午
                        
											 | 
										 
										
											
												
													 
													
														kkindof
													
													
														 
														
  
														 注册: 2011-11-10
														
														 发 贴: 15
														
													
												 
											 | 
											
												
													
														
															
																 
																
																	Re: 一起来探讨个有意思的问题 
																
															
														 | 
													 
													
														| 
														  
														 | 
													 
												 
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-08-28, 13:52 下午
                        
											 | 
										 
										
											
												
													 
													
														WillingBug163
													
													
														 
														
  
														 注册: 2013-08-19
														
														 发 贴: 14
														
													
											  | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
			
				
					
						
							
								
									
										
											
												
												 
                            2013-09-01, 22:14 下午
                        
											 | 
										 
										
											
												
													 
													
														格蠹老雷
													
													
														 
														
  
														 注册: 2005-12-19
														
														 发 贴: 1,303
														
													
												 
											 | 
											
												
												
											 | 
										 
										
											
												
													
														
															 
														 | 
														
															
														 | 
													 
													
														| 
															
														 | 
														
															IP 地址: 已记录  
														 | 
														
															报告
														 | 
													 
												 
											 | 
										 
									 
								 | 
							 
						 
					 | 
				 
			 
		
	
	
		
			| 
				高端调试 » 软件调试 » Windows内核调试 » Re: 一起来探讨个有意思的问题
			 | 
			
				
			 | 
		 
	 
	
 
								             | 
                                              | 					
								            
									            
								             | 
							             
						             
					             
				             
			          
                     |