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 или даже лучше: обе)