Перейти к содержанию
    

Windows: отключить кэширование чтения для USB MSD

Здравствуйте!

Собрал устройство, которое со стороны винды видно как USB Mass Storage Device.

 

Некоторые изменяемые данные видны со стороны Винды тоже как файлы (ну, например, текущее время контроллера).

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

 

Как-то с этим можно бороться? Еужно либо полностью отключить кэширование (чтобы все шло напрямую к диску), либо сделать принудительное обновление содержимого кэша, скажем, 1 раз в секунду.

 

Насколько я понял после недолгого гугления, проблема эта существует:

http://www.experts-exchange.com/Storage/Misc/Q_27825263.html

http://www.embeddedrelated.com/groups/lpc2000/show/49476.php

 

на уровне написания своего софта проблема (вроде бы!) решаема:

http://msdn.microsoft.com/en-us/library/aa...8(v=vs.85).aspx

 

Но вот так ли это? И нет ли каких-то вариантов инициировать обновление кэше со стороны USB MSD устройства, например, выдавая кучу ошибок в ответ на запросы Винды?

Или кто-то уже писал софт, позволяющий достучаться до секторов на USB MSD, минуя кэш? то есть специальная программка, делающая все нужное для обновления кэша?

 

Крайний вариант- это обрубить USB, тогда устройство переподключится, но в винде это сопровождается кучей визуальных эффектов :(

 

Пока что штатно нашел в винде включение-отключение кэширования записи, но про кэширования чтения видимо не подумали. :(

 

Помогите, пожалуйста. Кто чем может.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кэширование здесь ни при чём. Чтение файлов не кэшируется - в некоторых ОС кэшируется (откладывается) запись файлов, с целью ускорения записи путём объединения операций записи в одну.

Ни винда, ни любая другая ОС не может непрерывно сканировать все файлы на диске на предмет - а не изменился ли какой файл сам собою, произвольно. Все модификации файловой системы и самих файлов должны идти через ОС - это один из постулатов ОС. Либо юзер должен нажать кнопку "Обновить".

 

Однако, существуют механизмы, позволяющие уведомить ОС об изменениях в файловой системе, чтобы она перечитала файлы или каталоги. Это решается двумя способами:

1) диск должен быть виден как сетевой диск, изменения на сетевых дисках нотифицируются всем подключенным клиентам,

2) применительно к USB - нужно использовать не Mass Storage, а MTP - Media Transfer Protocol. На таком протоколе работают многие современные фотокамеры и медиа-плееры (ведь в фотокамере новая фотка может появиться независимо от ОС). Там в протокол заложена возможность уведомления системы об изменениях в файлах.

 

С Mass Storage без доп. софта ничего путного в этом ракурсе выловить не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кэширование здесь ни при чём. Чтение файлов не кэшируется - в некоторых ОС кэшируется (откладывается) запись файлов, с целью ускорения записи путём объединения операций записи в одну.

Ни винда, ни любая другая ОС не может непрерывно сканировать все файлы на диске на предмет - а не изменился ли какой файл сам собою, произвольно. Все модификации файловой системы и самих файлов должны идти через ОС - это один из постулатов ОС. Либо юзер должен нажать кнопку "Обновить".

К сожалению, мне не удалось найти эту волшебную кнопочку "обновить" в операционной системе "Windows".

Ни одна из нижеперечисленных операций не ведет к обновлению кэша (то есть по USB шине не передается ни одной команды чтения сектора с физического устройства):

1. Запуск/перезапуск программы типа "проводник Виндоус", "Тотал командер", "ФАР"

2. открытие/закрытие файла в просмотрщике-редакторе.

3. Нажатие кнопочек "Обновить", "свойства диска"

4. Копирование файла на компьютер.

 

Вероятно, все дело в том, что я имею дело с маленьким USB диском, 4 МБ, и он целиком поместился в буфере кэша в момент подключения устройства.

 

Что срабатывает- это попытка записать на диск. Сейчас он у меня read-only, так после пробной записи и ошибки диск таки перечитывается.

Попробую на этом сыграть :(

 

Однако, существуют механизмы, позволяющие уведомить ОС об изменениях в файловой системе, чтобы она перечитала файлы или каталоги. Это решается двумя способами:

1) диск должен быть виден как сетевой диск, изменения на сетевых дисках нотифицируются всем подключенным клиентам,

2) применительно к USB - нужно использовать не Mass Storage, а MTP - Media Transfer Protocol. На таком протоколе работают многие современные фотокамеры и медиа-плееры (ведь в фотокамере новая фотка может появиться независимо от ОС). Там в протокол заложена возможность уведомления системы об изменениях в файлах.

С Mass Storage без доп. софта ничего путного в этом ракурсе выловить не получится.

Большое спасибо. Но, первое чтение по диагонали про MTP энтузиазма не добавило- наворочено и ресурсоемко со стороны устройства получается. И если поддержка MSD/USB со всеми потрохами без оптимизации в 8 кбайт кода + 1 кбайт ОЗУ на PIC18 лезет, то MTP думаю для более пузатых случаев.

 

А что есть "доп софт"? Имеете в виду для передергивания USB MSD? Сейчас уже вижу, что достаточно организовать в этом допсофте периодически запись в фиктивный файл на моем MSD, при этом каталог перечитывается. Или можно изящнее сделать?

 

Сейчас, собственно и так нормально- это логгер, который имеет право отложить "логгирование" на время USB сеанса. Такое положение вещей вполне в рамках стандартного использования. Но хотелось большего.... Сейчас понимаю, что мои хотелки выходят за рамки идеологии MSD, соответственно штатно не решаемы- нужны костыли :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Upd:

Скажу больше: запись файла тоже ни к чему физическому не приводит. ничего не перечитывается.

Пример: записываю файл на "диск". Фактически файл никуда не записывается, в USB стоит заглушка "при записи секторов отвечать TRUE". Результат- винда показывает мне "диск" с "записанным" файлом. То есть фактически этого файла нет ни в служебных секторах FAT, ни, разумеется, в области данных, но для драйвера винды достаточно полученного "TRUE" от USB, не тратит сил даже на перечитывание каталога с диска, все крутится в кэше. (кэширование записи на диск в свойствах диска я отключил, но тут именно в кэшированном чтении проблема).

Мда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно обсуждалось здесь, поищите.

Кеширование не при чем.

USB Mass Storage Device оперирует на уровне секторов, и ничего не знает о файловой системе. Когда и в каком порядке ОС записывает и считывает сектора этой файловой системы, это ее дело. Попытки одновременно работать с носителем как со стороны РС через USB MSD и со стороны устройства, ни к чему кроме развала ФС не приведут.

Неоднократно наблюдал "фантомное" поведение ФС на разных устройствах при одновременном доступе через MSD.

 

Как верно заметили, обновить файловую систему можно только перемонтировав диск.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно обсуждалось здесь, поищите.

Кеширование не при чем.

USB Mass Storage Device оперирует на уровне секторов, и ничего не знает о файловой системе. Когда и в каком порядке ОС записывает и считывает сектора этой файловой системы, это ее дело. Попытки одновременно работать с носителем как со стороны РС через USB MSD и со стороны устройства, ни к чему кроме развала ФС не приведут.

Неоднократно наблюдал "фантомное" поведение ФС на разных устройствах при одновременном доступе через MSD.

 

Как верно заметили, обновить файловую систему можно только перемонтировав диск.

угу. выводы таковы:

1. Если штатно- то запрещать изменение файлов на время подключенного USB.

2. Если свое писать- то читать посекторно и разбираться по своим правилам. Сектора читать точно можно, по крайней мере старый добрый WinHex это может, его кнопочка "Refresh View" замечательно перечитывает сектор напрямую с физического носителя.

3. Может быть можно и пофайловое чтение сделать напрямую с диска, это снимает часть работы, посвященную файловой системе, вроде бы это возможно (я давал ссылку на MSDN). Но опять же, свой софт нужен.

 

Я упустил какой-нибудь вариант? Может есть оболочка, в которой это реализовано? какой-нибудь СуперКоммандер, имеющий кнопочку/функцию "обновить"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

угу. выводы таковы:

1. Если штатно- то запрещать изменение файлов на время подключенного USB.

2. Если свое писать- то читать посекторно и разбираться по своим правилам. Сектора читать точно можно, по крайней мере старый добрый WinHex это может, его кнопочка "Refresh View" замечательно перечитывает сектор напрямую с физического носителя.

3. Может быть можно и пофайловое чтение сделать напрямую с диска, это снимает часть работы, посвященную файловой системе, вроде бы это возможно (я давал ссылку на MSDN). Но опять же, свой софт нужен.

 

Я упустил какой-нибудь вариант? Может есть оболочка, в которой это реализовано? какой-нибудь СуперКоммандер, имеющий кнопочку/функцию "обновить"

В ТоталКомандере такая кнопка по-моему есть .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...