[an error occurred while processing this directive]
DMA, выделение памяти, драйвер?????
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)
Цель.
Осушествить запись/чтение неким PCI девайсом кусок памяти выполняемого на центральном процессоре приложения.
Что делаю.
1. В приложении выделяю нужный объем.
2. Узнаю его реальный (а не логический, который внутри приложения) адрес.
3. сообщаю этот адрес PCI устройству и размер блока.
4. PCI устройство записывает его туда.
5. Затем PCI устройство считывает его (при этом считывает именно то, что и записало).
6. Смотрю по средствам приложения, которое выполняется на PC что записано в той выделенной области. Там то что было с самого начала, до записи туда PCI устройством.
Впринципе все симптомы, указывают на то, что чтото не правильно с адресами: 1. Если я контроллером PCI выставляю неправилный адрес на шину и попадаю в другое место -проверял на видеокарте, вроде попадал туда када нужно. 2. Получил неправильный реальный адрес - над этим думают нащи программеры, говорят что все вроде правильно. 3. Самый интересный случай - кеширование памяти в процессоре. Т.е. я пишу то в память, но приложение видит то, что храниться в кеше. Возникает вопрос, как синхронизовать кеш с памятью в этом случае?
Составить ответ
|||
Конференция
|||
Архив
Ответы
- КЭШ тут не причем. Скорее всего, программисты неправильно выделяют буфер. Он должен непрерывным и неперемещаемым. Непрерывно система обычно может выделять куски не больше 16-32КБайт (по несколько страничек подряд) и для больших буферов надо использовать механизм ScatterGather List. Под какой ОС работаете? Как определяете физ. адрес? — Щедрый (17.10.2002 13:47, пустое)
- Дело в том, что память страничная. Размер страницы 4096 байт. При выделении памяти размером больше страницы будет выделено несколько страниц. Беда в том, что страницы лежат в памяти не подряд, так что начальный адрес это только начало первой страницы, а остальные м.б. (практически всегда) физически совсем в других "уголках" памяти. Так что попадешь не туда. Либо надо выделять непрерывный кусок памяти (что на уровне юзера невозможно, только драйвером), либо передавать девайсу MDL всех страниц (это тем более драйвером, да и геморой еще тот). Я делал первым способом. — Озадаченный (16.10.2002 20:26, пустое)
- Обьявить в программе область памяти больше чем КЭШ и "пройтись" по ней. Если поможет, тогда действительно дело в КЭШ. — misyachniy (16.10.2002 18:44, пустое)
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание
|||
Без кадра
E-mail:
info@telesys.ru