Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Надо драйверу "придержать" память приложения.  (Прочитано 11003 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PredatorAlpha
Помогающий

us
Offline Offline

« : 16-06-2009 18:51 » 

Есть PCI-плата, что мастером пишет в память компьютера по заданным адресам в буфер.
Для выделения этого буфера в ранних версиях использовался невыгружаемый (nonpaged)  пул памяти ядра, который потом маппировался на адресное пространство приложения.
В новой версии требуется большой буфер - больше чем лимит в 256 Мб nonpaged  пула.
Можно выделить память собственно в приложении и залочить, но тогда при слёте приложения память буфера освобождается и отдаётся другим задачам, а плата про это узнаёт не сразу, продолжает писать, следствие - синий экран.
Можно ли драйверу как-то "придержать" память приложения, что бы она после слёта не сразу освобождалась?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 16-06-2009 20:54 » 

хм. а почему нельзя выделять память в драйвере и лочить ее там же, потом мапировать в приложение? сколько памяти надо?
и... разве lock это то же самое что nonpaged? - никогда не пользовался...
еще где то могут быть настройки для увеличения пределов nonpaged... мне казалось я видел мельком... правда могу ошибаться... да и в XP только 1Г на ядро...
насчет "придержать" попробую завтра глянуть...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
PredatorAlpha
Помогающий

us
Offline 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
Помогающий

us
Offline Offline

« Ответ #3 : 17-06-2009 06:55 » 

Если я не ошибаюсь, то выделяемая и залоченная драйвером память находится в nonpaged. Впрочем, я это проверю.
Глянул. Память, распределённая в MmAllocateContiguousMemorySpecifyCache() и залоченная MmMapLockedPages() таки находится в nonpaged пуле. Похоже, что все буфера ядра в конце-концов ложатся в nonpaged или paged пул, всё остальное - это обёртки вокруг них.
Жаль((((
« Последнее редактирование: 17-06-2009 06:59 от PredatorAlpha » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #5 : 17-06-2009 07:43 » 

Я для определения nonpaged эксперементировал со старой платой, там выделяется непрерывная.
В новой будет Scatter/gatter, для буферов >=64М непрерывная - это сильно стрёмно.

Скорость будет 10Gбит/сек. Т.е. больше гигабайта/сек.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 17-06-2009 08:11 » 

эээ.... да) многовато) не проще было на плату памяти влепить? оно конечно статической поставить не получится(дорого) но и динамическую тоже можно подключить. у xilinx корка есть... даже работает - мы проверяли(там только бага какая то была с 1-2Г модулем... либо мы в разводке ошиблись)
« Последнее редактирование: 17-06-2009 08:13 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #7 : 17-06-2009 08:43 » 

Не получится. Разгребалка должна быть наверху.
xilinx и так будет забит по самое нихочу - такой поток по PCI-express протолкнуть, да ещё + встречный и служебные - задача нетривиальная.
память на xilinx (в пятом виртексе) висит на PowerPC. Его и так на нормальную обработку не хватает, а если ещё и железо будет память занимать... Так что - только вверх.
Очень надеюсь, что хватит и 64 метров, но боюсь таки прийдётся придерживать память приложения. Чего очень бы не хотелось. Тем более, не понятно как. В ранних бета версиях, когда память была выделяема приложением, вылет приложения почти гарантировано приводил к синему экрану.
« Последнее редактирование: 17-06-2009 08:58 от PredatorAlpha » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 17-06-2009 12:57 » 

ну не знаю... тут в специфику надо погружаться... но какая то монстроидальная задача у вас видимо)
по мне - так данным на таких скоростях в ПК делать нечего. в реальном времени. следовательно и вводить в реальном времени незачем) а так - на одну буферизацию лагов шины пол виртекса уйдет..

однако я не понимаю как можно в приложении выделить физически непрерывную память? помоему это впринципе невозможно. отмапировать  можно, но она скорее всего рваная будет.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #9 : 17-06-2009 16:06 » 

Будет Scatter/gatter, причём аппаратный.  Для основного буфера, по крайней мере.

Увы, нам нужна достататочно шустрая обработка. Не риал-тайм, но всё-таки. Кое-что обрубится внизу, большая часть - наверху, а ещё и ответ всосать вниз надо.

Вопрос - если процесс апликухи "прирезается" системой, как драйвер может это узнать ДО начала прибивания процесса системой - пока ещё память не стала забираться, ничего не закрыто и т.п.?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 17-06-2009 21:31 » 

ну... наверное все с ексцепшена начнется) вполне возможно что даже какие нибудь штатные средства отлова есть.
 приложение по моему в двух случаях системой убивается. либо при возникновении необработанного исключения, либо если оно оконное - при отсутствии обработки сообщений окна в течении некоторого времени(по умолчанию кажется 30 сек)
кстати.. возможно еще один вариант держать приложение в памяти - завесить одну из нитей в режим ядра...может на повышенный IRQL. вызвать функцию драйвера а в драйвере отложить ее  завершение. кажется у меня были такие случаи но точно - не помню...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
DrGluck
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 23-06-2009 15:22 » 

Сорри что вмешиваюсь, но мне кажется у вас задача както не так поставлена. Имхо такому реалтайм потоку на PC делать нечего. А нельзя это как-нибудь разгребать на железке? Например при помощи DSP. Чтобы комп только управлял платой, а она сама все делала. Или у вас задача стоит этот поток на другие железки PCI-E распихать?
Записан

Good user - dead user
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines