как получить доступ к оперативной памяти с помощью контроллера DMA?

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

Я делаю это на архитектуре x86, и это 8237 DMA.


person user1083212    schedule 06.02.2012    source источник
comment
Что это за устройство? Это флэш-память USB или SATA?   -  person David Schwartz    schedule 06.02.2012
comment
Об этом должна заботиться операционная система ядра... если нет ядра.   -  person m0skit0    schedule 06.02.2012
comment
Дэвид: Это флэш-память SDD, откуда я должен скопировать данные (образ ядра) и поместить их в ОЗУ. Я прочитал несколько руководств, но cudnt получил много информации о том, как выполнять копирование из памяти в память (особенно установка адреса назначения. m0skit0 - я выполняю эту операцию загрузчиком, и пока нет ядра, так как сам загрузчик копирует ядро образ из флешки в ОЗУ.   -  person user1083212    schedule 06.02.2012
comment
Вероятно, он недоступен контроллеру прямого доступа к памяти, что не совсем ясно из вопроса. В любом случае нет смысла его использовать, DMA полезен только в том случае, если процессор может делать что-то еще, пока идет передача.   -  person Hans Passant    schedule 06.02.2012
comment
@Hans - Процессор будет проверять подпись образа rootfs для безопасной загрузки, пока происходит передача образа ядра. Пожалуйста, просмотрите эту страницу: elinux.org/DMA_Copy_Of_Kernel_On_Startup Есть какие-либо предложения по управлению оперативной памятью с помощью DMA?   -  person user1083212    schedule 07.02.2012
comment
Режим ядра: DMA. В противном случае это зависит от ОС.   -  person Powerslave    schedule 14.04.2013


Ответы (1)


Контроллер прямого доступа к памяти 8237 может осуществлять передачу данных из ОЗУ в ОЗУ, из ввода-вывода в ОЗУ и из ОЗУ в устройство ввода-вывода.

Вы должны принять во внимание, что вы сможете скопировать только до 64 КБ данных. Если вы хотите скопировать более 64 КБ, вам потребуется более одной операции передачи.

Предполагая, что вы используете ту же среду, что и IBM PC, и можете установить адрес сегмента целевой памяти в отдельной защелке, вам потребуется:

  1. Нормализуйте сегмент адреса назначения: смещение, чтобы смещение было меньше 16. Нормализация выполняется следующим образом (DIV — целочисленное деление, MOD — модуль):

    normalized_segment = segment + offset DIV 16

    normalized_offset = offset MOD 16

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

  3. Загрузите адрес смещения в регистр начального адреса канала DMA, который вы хотите использовать.
  4. Продолжить настройку DMA (длина передачи, режим, прерывание по EOC и т. д.)
person mcleod_ideafix    schedule 21.11.2013