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

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

us
Offline Offline

« : 24-04-2009 21:21 » 

Доброго дня всем!
Есть несколько физически непрерывных кусков памяти одинакового размера, выделенных с помощью MmAllocateContiguousMemorySpecifyCache ( )  , лежащих по разным адресам (кратных размеру страницы адресом и длинной).
Их надо "склеить" внутри пользовательского виртуального пространства адресов в один непрерывный буфер (при вызове функции драйвера). Каким образом это можно сделать, с помощью какой системной функции?
« Последнее редактирование: 24-04-2009 21:27 от PredatorAlpha » Записан
Ochkarik
Модератор

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

« Ответ #1 : 26-04-2009 07:25 » 

MmMapLockedPagesSpecifyCache  помоему подойдет. с наверное каким нибудь MmAllocateMappingAddress.

а вообще то что вы делаете называется scatter-gatter механизм. в винде есть специальные функции)
Записан

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

us
Offline Offline

« Ответ #2 : 26-04-2009 09:39 » 

MmMapLockedPagesSpecifyCache  помоему подойдет. с наверное каким нибудь MmAllocateMappingAddress.
Спасибо, гляну..
Цитата
а вообще то что вы делаете называется scatter-gatter механизм. в винде есть специальные функции)
Увы, нам нужны "страницы" больше 4К
Записан
Ochkarik
Модератор

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

« Ответ #3 : 26-04-2009 20:16 » 

да, с 4кб как-то они погорячились. с другой стороны мне удавалось и 32Мб выделять непрерывно. но только при старте системы. больше - просто не пробовал. иначе - дефрагментация памяти.
или вру... 8М. 32М - это у меня вторичная буферизация nonpaged была
« Последнее редактирование: 26-04-2009 20:17 от Ochkarik » Записан

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

us
Offline Offline

« Ответ #4 : 27-04-2009 07:05 » 

да, с 4кб как-то они погорячились. с другой стороны мне удавалось и 32Мб выделять непрерывно. но только при старте системы. больше - просто не пробовал. иначе - дефрагментация памяти.
или вру... 8М. 32М - это у меня вторичная буферизация nonpaged была

У нас на старой плате 8М непрерывной памяти при старте как правило выделялось без проблем (при 2Г оперативки). При работе тоже как правило выделялось, если ничего большого запущено не было.
Но в новой разработке нужен буфер порядка 64М (причём 2 штуки). Тут уже предвидим проблемы....
Аппаратная реализация такова, что по 4К scatter-gatter реализовать несколько накладно - нужно много драгоценной памяти-ресурса Xilinx. Желательны "страницы" минимум в 64К. Отсюда и задача.
« Последнее редактирование: 27-04-2009 07:19 от PredatorAlpha » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #5 : 27-04-2009 09:11 » 

Извиняюсь, что со свинным рылом, но мне интересно, есть ли у винды поддержка страниц 4МБ? Аппаратно это поддерживается аж еще с Pentium.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Ochkarik
Модератор

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

« Ответ #6 : 27-04-2009 09:25 » 

RXL, вот не знаю... вроде бы везде в DDK дефенишеном забит размер страницы 4к.
wdm.h:
Код:
//
// Define the page size for the Intel 386 as 4096 (0x1000).
//

#define PAGE_SIZE 0x1000
так что думаю можно только так.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Рыжий Тигра
Гость
« Ответ #7 : 27-04-2009 09:39 » 

RXL >> интересно, есть ли у винды поддержка страниц 4МБ? Аппаратно это поддерживается аж еще с Pentium.
PredatorAlpha > Размер страницы виртуальной памяти может быть равным как 4К, так и 8М (по крайней мере аппаратные средства процессоров начиная с Пентиума позволяют это
Делитесь подробностями, очень актуально!!!

PredatorAlpha > 8М непрерывной памяти при старте как правило выделялось без проблем (при 2Г оперативки). При работе тоже как правило выделялось
Угу. Как исключение - три дня подряд не выделялось даже при старте. Про хроническое исключение при десятом-двадцатом перезапуске драйвера за день (отладка, сэр! Улыбаюсь ) я вообще молчу... Жаль
Записан
Ochkarik
Модератор

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

« Ответ #8 : 27-04-2009 10:05 » 

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

ЗЫ впрочем я так понял что вы это и так знаете)))
в моем драйвере заказывается 8Мб. драйверу лет пять наверное. за это время ни разу не встречалась ситуация когда память не выделялась при старте.
« Последнее редактирование: 27-04-2009 10:12 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Рыжий Тигра
Гость
« Ответ #9 : 27-04-2009 10:21 » 

Ochkarik > речь идет о физических адресах а не виртуальных.
Т.е. виртуальная четырёхметровая страница на Пентюхе никаким боком не физически-непрерывная? Тогда это просто строка в таблице блоков страниц, это неинтересно, это я и сам знаю... Жаль
Записан
Ochkarik
Модератор

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

« Ответ #10 : 27-04-2009 10:35 » 

нет. страница то - это страница. физически она непрерывна. но винда использует страницы по 4к.
для использования другого размера страниц - надо проц переконфигурировать(ну не то чтобы проц. но многое...какие то флаги в дескрипторах памяти) . и.. и видимо - не использовать Windows)


« Последнее редактирование: 27-04-2009 11:52 от Ochkarik » Записан

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

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

« Ответ #11 : 27-04-2009 10:41 » 

PredatorAlpha, я кстати насчет scatter-gatter подчти не разбирался... а там обязательно список страниц на борту хранить? или там их переодически читать можно?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Рыжий Тигра
Гость
« Ответ #12 : 27-04-2009 10:54 » 

Ochkarik > надо проц переконфигурировать. и.. и видимо - не использовать Windows)
Что совой об пень, что пнём об сову... Жаль Я бы сам не против отказаться, да только весь остальной софт (~50 человеко-лет разработки) давно под "форточки" заточен. Жаль

Ochkarik > в моем драйвере заказывается 8Мб
А чем выделяешь? Я пробовал двумя способами - AllocateCommonBuffer() и MmAllocateContiguousMemorySpecifyCache(). Первый способ при заказе 8 метров возвращал стабильно 32 кила, второй - или сколько заказали, или обламывается. (Так задумано: под тогдашнее устройство давать меньше было нельзя - там 8-мегабайтные bus-master окна с выравниванием, кратным размеру окна.)

(из другой темы) Ochkarik > ограничение PAGE_SIZE * NumberOfMapRegisters  - эт ересь
А как правильно? Делись описанием/примером или ссылкой на оное. Надо многомегабайтный буфер, непрерывный в виртуальных адресах, пригодный для отображения на пользовательское пространство опять же как непрерывный, и фрагментированный на ~1K одинаковых кусочков с выравниванием по размеру кусочка. (Либо способ сборки тысячи небольших физически непрерывных кусочков в один виртуально непрерывный буфер - так даже лучше, ибо можно применить ещё много где.)
Записан
Ochkarik
Модератор

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

« Ответ #13 : 27-04-2009 11:24 » 

Рыжий Тигра,
нет... все не то.
выделять надо через функции DMAAdapter.
PDMA_ADAPTER   DMAAdapter = IoGetDmaAdapter(...)
 потом
DMAAdapter->DmaOperations->AllocateCommonBuffer(...)

насчет ереси... не знаю. честно говоря я тогда с этим так и не разобрался. заработало и оставил как есть. код у Вальтера Они брал помоему.
Код:
    RtlZeroMemory(&devDescr,sizeof(DEVICE_DESCRIPTION)); //обнуляем лишнее (по рекомендации)
    devDescr.Version = DEVICE_DESCRIPTION_VERSION; //перавя версия, нулевая исползуется только при IgnoreCounter = FALSE
    devDescr.Master = TRUE;
    devDescr.ScatterGather = FALSE;
    //devDescr.DemandMode = Not Used
    //devDescr.AutoInitialize = Not Used
    devDescr.Dma32BitAddresses = TRUE;
    devDescr.IgnoreCount = TRUE;
    //devDescr.Reserved1 = 0;
    devDescr.Dma64BitAddresses = FALSE;
    //devDescr.DoNotUse2 = 0; //=devDescr.BusNumber - NotUsed in WDM
    //devDescr.DmaChannel = 0; //только для Slave устройств
    devDescr.InterfaceType = PCIBus;
    //devDescr.DmaWidth -
    //devDescr.DmaSpeed - не для мастера? (только если value only if the machine's ACPI BIOS supports it)... ничего не понял
    //devDescr.MaximumLength = ROUND_TO_PAGES(SYSTEM_MEMORY_FOR_BOARD/2);   
    devDescr.MaximumLength = PAGE_SIZE;    //че тут ставить я не знаю... пока - не знаю!(может один мегобайт? вроде у нас такие передачи...
    //в любом случае они просили округлить до PAGE_SIZE, да на здоровье!
    //devDescr.DmaPort = 0;   //говорят, что это устаревший параметр. но нужен для совместимости... для Legacy...

    devExt->NumberOfMapRegisters = 2; //мои изыски - вряд ли нужно

PS фиг знает. у нас выравнивание до 4 к допустимо...
« Последнее редактирование: 27-04-2009 11:26 от Ochkarik » Записан

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

us
Offline Offline

« Ответ #14 : 27-04-2009 11:37 » 

RXL >> интересно, есть ли у винды поддержка страниц 4МБ? Аппаратно это поддерживается аж еще с Pentium.
PredatorAlpha > Размер страницы виртуальной памяти может быть равным как 4К, так и 8М (по крайней мере аппаратные средства процессоров начиная с Пентиума позволяют это
Делитесь подробностями, очень актуально!!!

У меня была ошибка. Не 8М, а 4М.
Аппаратная реализация - глава 5.6. Страничное управление памятью. Книга - М.Гук и В.Юров "Процессоры Pentium 3, Athlon и другие."
Насчёт программной реализации в Винде - не скажу, не знаю.
Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #15 : 27-04-2009 12:38 » 

PredatorAlpha, я кстати насчет scatter-gatter подчти не разбирался... а там обязательно список страниц на борту хранить? или там их переодически читать можно?

Теоретически можно и читать...... Это конечно существенно увеличивает сложность аппарата.. Будем думать...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines