Прямой доступ к устройствам памяти под Windows / Linux - PullRequest
2 голосов
/ 26 октября 2010

Hello
В настоящее время я пишу программное обеспечение для проверки целостности устройств флэш-памяти. (с использованием c ++ iostreams)

Для достижения этой цели файлы со случайным содержимым записываются на устройство, считываются, копируются, перемещаются, сравниваются (я помещаю устройство в напряженное состояние и проверяю, периодически ли данные действительны) ...
Снаружи все выглядит отлично, но за кулисами стоит проблема.

Когда я проанализировал команды, отправляемые на устройство через кабель ATA / SATA (с Bus Doctor), я обнаружил, что (особенно) команды чтения часто не выполняются. Тем не менее данные доступны для программы. Поэтому они должны исходить из буфера, что в моем случае неприемлемо. Всякий раз, когда я читаю Данные, они должны поступать прямо с диска, а не из кеша. Производительность чтения / записи вообще не важна.

Но я не нашел способа заставить Windows ничего не буферизировать (в диспетчере устройств есть возможность отключить кэширование записи для конкретного устройства, но это не дает желаемого эффекта).
Если кто-нибудь знает, как это сделать: Скажите, пожалуйста,
(то же самое касается любого совета относительно Linux. Я думаю, что я столкнусь с теми же проблемами там)

Единственное решение, которое я смог найти, - это прямой ввод / вывод.
Что я нашел для Windows это:

http://www.internals.com/utilities_main.htm

Библиотека WinIo позволяет 32-разрядным приложениям Windows напрямую получать доступ к портам ввода-вывода и физической памяти. Он обходит механизмы защиты Windows, используя комбинацию драйвера устройства в режиме ядра и несколько низкоуровневых методов программирования.

и http://www.direct -io.com /

Direct I / O - первый в мире драйвер устройства для Microsoft Windows NT, Windows 2000, Windows XP и Windows Server 2003, который обеспечивает прямой аппаратный доступ к существующему программному обеспечению без каких-либо усилий по программированию на вашей стороне

Вопросы:
Кто-нибудь когда-нибудь сталкивался с подобной проблемой и может дать мне какой-нибудь совет?
Действительно ли мне нужно использовать Direct I / O или есть какая-то опция / настройка ОС, которую я не нашел (Windows или Linux)
Знаете ли вы другие библиотеки для прямого ввода-вывода (Windows или Linux или даже лучше: обе)

Ответы [ 3 ]

1 голос
/ 26 октября 2010

В Linux вы можете использовать флаг O_DIRECT при открытии устройства, и тогда все обращения будут обходить кэш страницы и переходить непосредственно к устройству.

Обратите внимание, что операции чтения и записи O_DIRECT должны соответствовать размеру блока устройства (обычно 512 байт) в адресах памяти, смещениях файлов и размерах запросов на чтение / запись.

1 голос
/ 26 октября 2010

Для Windows вы можете отключить буферизацию, используя Win32 API напрямую.

При открытии или создании файла с функцией CreateFile можно указать флаг FILE_FLAG_NO_BUFFERING, чтобы отключить системное кэширование данных, считываемых или записываемых в файл.Хотя это дает полный и прямой контроль над буферизацией ввода / вывода данных, в случае файлов и аналогичных устройств существуют требования к выравниванию данных, которые необходимо учитывать.

Не уверен, что это можно сделать вC ++ стандартная библиотека.Вы можете отключить буферизацию на уровне iostream, но это может не повлиять на буферизацию O / S.

0 голосов
/ 04 сентября 2015

Вы можете получить доступ к любому месту в памяти в Linux в / proc / kcore.Поэтому, если вы знаете, по какому адресу сопоставляется память вашего устройства (что можно выяснить, просмотрев каталог / proc), вы можете читать / записывать непосредственно в него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...