PredatorAlpha
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 16-06-2009 18:51 »   | 
								
								 | 
							  
							 
							Есть PCI-плата, что мастером пишет в память компьютера по заданным адресам в буфер. Для выделения этого буфера в ранних версиях использовался невыгружаемый (nonpaged)  пул памяти ядра, который потом маппировался на адресное пространство приложения.  В новой версии требуется большой буфер - больше чем лимит в 256 Мб nonpaged  пула. Можно выделить память собственно в приложении и залочить, но тогда при слёте приложения память буфера освобождается и отдаётся другим задачам, а плата про это узнаёт не сразу, продолжает писать, следствие - синий экран. Можно ли драйверу как-то "придержать" память приложения, что бы она после слёта не сразу освобождалась? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 16-06-2009 20:54 »   | 
								
								 | 
							  
							 
							хм. а почему нельзя выделять память в драйвере и лочить ее там же, потом мапировать в приложение? сколько памяти надо?  и... разве lock это то же самое что nonpaged? - никогда не пользовался...  еще где то могут быть настройки для увеличения пределов nonpaged... мне казалось я видел мельком... правда могу ошибаться... да и в XP только 1Г на ядро... насчет "придержать" попробую завтра глянуть... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							PredatorAlpha
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 16-06-2009 21:18 »   | 
								
								 | 
							  
							 
							http://blogs.technet.com/mark_russinovich/ - хорошо расписано про nonpaged Если я не ошибаюсь, то выделяемая и залоченная драйвером память находится в nonpaged. Впрочем, я это проверю. Памяти - очень надеюсь что 64 М хватит, но боюсь, прийдётся до 256 М доводить. А в ХР - 256 метров - это на всех предел.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 17-06-2009 07:03 от PredatorAlpha »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							PredatorAlpha
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 17-06-2009 06:55 »   | 
								
								 | 
							  
							 
							Если я не ошибаюсь, то выделяемая и залоченная драйвером память находится в nonpaged. Впрочем, я это проверю.
  Глянул. Память, распределённая в MmAllocateContiguousMemorySpecifyCache() и залоченная MmMapLockedPages() таки находится в nonpaged пуле. Похоже, что все буфера ядра в конце-концов ложатся в nonpaged или paged пул, всё остальное - это обёртки вокруг них.  ((((  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 17-06-2009 06:59 от PredatorAlpha »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 17-06-2009 07:23 »   | 
								
								 | 
							  
							 
							так нужна еще и непрерывная память? или вы таки со Scatter/gatter сделали? в конце концов сделайте двойную буферизацию... скорости порядка 30Мбайт/сек вполне реально буферизировать.
  и кстати. при чем залочивание MmAllocateContiguousMemorySpecifyCache() если оно и так из несвопируемого пула? что то я совсем не понимаю...  функция MmMapLockedPages() - МАПИРУЕТ выделенную память а не лочит ее в памяти!!!! но для того чтобы мапирование работало - память должна быть несвопируемая, ТО ЕСТЬ: 1  либо выделена из NonPagedPool (тогда лочить не надо!), ИЛИ  2 выделена как PagedPool И ОБЯЗАТЕЛЬНО залочена MmMapLockedPagesSpecifyCache! еще раз MmMapLockedPages - может одну и ту же физическую память отобразить в вируальное пространство адресов разных процессов. адреса могут быть разными, а физически память одна. больше функция ничего не делает. но чтобы она работала корректно - память должна быть не перемещаемая. я так понимаю можно лочить любую память по ее дескриптору страниц MDL. ЛЮБУЮ память.
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 17-06-2009 08:08 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							PredatorAlpha
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 17-06-2009 07:43 »   | 
								
								 | 
							  
							 
							Я для определения nonpaged эксперементировал со старой платой, там выделяется непрерывная.  В новой будет Scatter/gatter, для буферов >=64М непрерывная - это сильно стрёмно.
  Скорость будет 10Gбит/сек. Т.е. больше гигабайта/сек. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 17-06-2009 08:11 »   | 
								
								 | 
							  
							 
							эээ.... да) многовато) не проще было на плату памяти влепить? оно конечно статической поставить не получится(дорого) но и динамическую тоже можно подключить. у xilinx корка есть... даже работает - мы проверяли(там только бага какая то была с 1-2Г модулем... либо мы в разводке ошиблись) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 17-06-2009 08:13 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							PredatorAlpha
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 17-06-2009 08:43 »   | 
								
								 | 
							  
							 
							Не получится. Разгребалка должна быть наверху. xilinx и так будет забит по самое нихочу - такой поток по PCI-express протолкнуть, да ещё + встречный и служебные - задача нетривиальная. память на xilinx (в пятом виртексе) висит на PowerPC. Его и так на нормальную обработку не хватает, а если ещё и железо будет память занимать... Так что - только вверх. Очень надеюсь, что хватит и 64 метров, но боюсь таки прийдётся придерживать память приложения. Чего очень бы не хотелось. Тем более, не понятно как. В ранних бета версиях, когда память была выделяема приложением, вылет приложения почти гарантировано приводил к синему экрану. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 17-06-2009 08:58 от PredatorAlpha »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 17-06-2009 12:57 »   | 
								
								 | 
							  
							 
							ну не знаю... тут в специфику надо погружаться... но какая то монстроидальная задача у вас видимо) по мне - так данным на таких скоростях в ПК делать нечего. в реальном времени. следовательно и вводить в реальном времени незачем) а так - на одну буферизацию лагов шины пол виртекса уйдет..
  однако я не понимаю как можно в приложении выделить физически непрерывную память? помоему это впринципе невозможно. отмапировать  можно, но она скорее всего рваная будет. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							PredatorAlpha
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #9 : 17-06-2009 16:06 »    | 
								
								 | 
							  
							 
							Будет Scatter/gatter, причём аппаратный.  Для основного буфера, по крайней мере.
  Увы, нам нужна достататочно шустрая обработка. Не риал-тайм, но всё-таки. Кое-что обрубится внизу, большая часть - наверху, а ещё и ответ всосать вниз надо.
  Вопрос - если процесс апликухи "прирезается" системой, как драйвер может это узнать ДО начала прибивания процесса системой - пока ещё память не стала забираться, ничего не закрыто и т.п.? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 17-06-2009 21:31 »   | 
								
								 | 
							  
							 
							ну... наверное все с ексцепшена начнется) вполне возможно что даже какие нибудь штатные средства отлова есть.  приложение по моему в двух случаях системой убивается. либо при возникновении необработанного исключения, либо если оно оконное - при отсутствии обработки сообщений окна в течении некоторого времени(по умолчанию кажется 30 сек) кстати.. возможно еще один вариант держать приложение в памяти - завесить одну из нитей в режим ядра...может на повышенный IRQL. вызвать функцию драйвера а в драйвере отложить ее  завершение. кажется у меня были такие случаи но точно - не помню... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							DrGluck
							
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 23-06-2009 15:22 »   | 
								
								 | 
							  
							 
							Сорри что вмешиваюсь, но мне кажется у вас задача както не так поставлена. Имхо такому реалтайм потоку на PC делать нечего. А нельзя это как-нибудь разгребать на железке? Например при помощи DSP. Чтобы комп только управлял платой, а она сама все делала. Или у вас задача стоит этот поток на другие железки PCI-E распихать? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Good user - dead user 
						 | 
					 
				 
			 |  
		 
	 | 
	 |