2009-06-10 3 views
2

Мне нужно переместить некоторые данные из одной области файла в другую. В настоящее время я читаю байты и записываю их обратно. Но мне интересно, будет ли выполнение DMA-передачи быстрее, если это возможно. Я нахожусь на C#, но допустимы небезопасные и функции p/invoke.Копирование данных в файле с использованием DMA

+0

Может ли memcpy автоматически передавать DMA, если это возможно? Если да, возможно, я могу использовать файлы с отображением памяти и вызывать memcpy (или memmove). – Fantius

+0

Или я, вероятно, уже делаю передачи DMA, и я просто этого не знаю? Даже если это так, я должен делать две передачи вместо одной - читать данные, а затем писать. Есть ли способ сделать это одним переводом? – Fantius

ответ

3

Вы, насколько я могу судить, не делают DMA «случайно», используя обычные файловые потоки для копирования из одного файла в другой. DMA используется в фоновом режиме в некоторых местах (например, для переноса с диска на RAM с помощью FileStreams), но он не может обрабатывать прямую копию потока файлов в файл на C#.

DMA сам по себе довольно сложный и родной для языков низкого уровня. Я имею в виду this document. Все примеры кода находятся в C и asm, поэтому он не применим непосредственно к C#.

ДМА еще один чип на материнской плате (как правило, это Intel 8237 чипа), что позволяет (программист), чтобы разгрузить переводы данных между платами ввода/вывода. DMA фактически означает «Прямой доступ к памяти». Примером использования DMA может быть способность Sound Blaster воспроизводить образцы в фоновом режиме. ЦП устанавливает звуковую карту и DMA. Когда DMA сообщается «идти», он просто перекопает данные из ОЗУ в . Так как это делается вне CPU, CPU может делать другие вещи во время передачи данных.

DMA использует систему каналов, доступ к которой осуществляется портами. Как правило, вы должны использовать asm для этого. Возможно, вы можете найти полезную информацию here или here.

Альтернативой может быть разрешение ОС на передачу: просто используйте File.Copy.

Смежные вопросы