haker_fox 61 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Добрый день, коллеги! Есть железка, которая предстаёт как USB MSC для ПК. Сам диск реализован в ОЗУ. Размер 16 Мб. На этот диск записывается один! файл. Можно ли внутри железки без FAT (как я понимаю, именно эта ФС используется в USB MSC по умолчанию в Win) обнаружить, что файл был записан (имя всегда одно и то же) и считать его? Не могу найти вразумительного ответа на просторах сети. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 1 hour ago, haker_fox said: Можно ли внутри железки без FAT Прочитать fat таблицу диска и найти там его, разбирая эту область. Полностью реализовывать поддержку fat не обязательно. Что-то типа read only fat, но еще сильнее урезанная. Можно в лоб - слить fat таблицу посекторно в двух состояниях: с записанных в нее файлом и без. Сравнением побайтно выяснить что изменилось в этой таблице. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 1 minute ago, Forger said: Прочитать fat таблицу диска и найти там его, разбирая эту область. Полностью реализовывать поддержку fat не обязательно. Что-то типа read only fat, но еще сильнее урезанная. Мда... Сейчас стал приходить к подобному же выводу. И, как мне кажется, теперь становится очевидным взять FatFS от мистера Чана, скомпилировать её в режиме только чтение, и не выдумывать альтернативу велосипеду 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 19 minutes ago, haker_fox said: И, как мне кажется, теперь становится очевидным взять FatFS от мистера Чана если позволяет место на флэши, то конечно так проще всего ) У мистера Чана поддержаны разные фат, а тут судя по всему нужна самая примитивная из них - fat12, хотя может и fat16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 20 minutes ago, Forger said: fat16 Она. Но в целом - да, лучше брать готовую либу. А то сегодня хотят один файл, завтра - сотню) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 53 минуты назад, Forger сказал: Можно в лоб - слить fat таблицу посекторно в двух состояниях: с записанных в нее файлом и без. Сравнением побайтно выяснить что изменилось в этой таблице. Не понятно - что именно автор имел в виду под "файл был записан (имя всегда одно и то же)"? Если мог быть случай записи в существующий файл записью поверх старых данных, то FAT-таблица скорей всего не изменится и её чтение ни чего не даст. Тогда поможет только чтение всего массива байт файла и контроль некоей CRC/хеша (заранее где-то посчитанной/сохранённой). PS: Ещё можно попробовать делать контроль по изменению записи в директории о файле. Точнее - о времени/дате его последней модификации. По уму - она тоже должна измениться, если только ПО на ПК не предпримет каких-то действий по недопущению этого. Вобщем-то многие компиляторы поступают именно так, когда решают - какие файлы стоит перекомпилить, а какие - нет (по дате/времени модификации). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 7 minutes ago, jcxz said: Если мог быть случай записи в существующий файл записью поверх старых данных, то FAT-таблица скорей всего не изменится и её чтение ни чего не даст. Как я понял нужно сравнить два состояния: есть один файл и нет ни одного файла. Типа пусто/не пусто. Действительно это можно сделать в лоб, тупо сравнивая несколько байтов по известному смещению внутри одного и того же заранее выясненного сектора. Конечно, если пишется только один файл и ничего более. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 3 часа назад, haker_fox сказал: Есть железка, которая предстаёт как USB MSC для ПК. Сам диск реализован в ОЗУ. Размер 16 Мб. На этот диск записывается один! файл. Можно ли внутри железки без FAT (как я понимаю, именно эта ФС используется в USB MSC по умолчанию в Win) обнаружить, что файл был записан (имя всегда одно и то же) и считать его? Не могу найти вразумительного ответа на просторах сети. ОС работает с MSC как с блочным устройством, используя, в том числе, и кэширование. Поэтому, с момента монтирования (подключения) до отсоединения, вправе писать блоки как угодно, сначала таблицу, потом данные, или наоборот. Или вообще не писать ничего, если сохраняемый файл не изменился, к примеру. Поэтому изнутри устройства USB понять, что файл записан и запись окончена можно, только если непрерывно мониторить FAT таблицу и как-то узнать "свой" файл, проверив его CRC, которое хранится в соседнем файле, например. Проще говоря, это костыли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 57 minutes ago, gerber said: Проще говоря, это костыли. Как тогда работают загрузчики, обновляющие прошивку через USB MSC? Там же механизм простой: закинул файл, и ПО обновлено... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 3 minutes ago, haker_fox said: Там же механизм простой: закинул файл, и ПО обновлено... С теми загрузчиками, что я знаком, обновление происходит ПОСЛЕ отключения девайса от ПК. Т. е сначала записывается образ загрузчика во некую флэш на устройстве как обычный файл. А уже потом сам загрузчик этот же файл вычитывает и обновляет прошивку камня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Отличить состояния 'девственно чистый диск' от 'что то записано' можно по наличию первой записи в root секторе. Отличить состояния 'что то пишется' от 'всё записно' со 100% вероятностью нельзя в принципе - FAT никак не помечает окончание записи в файл (если мой склероз мне не изменяет). Только по таймаутам или физическому размонтированию носителя (выдёргивание USB например) Читать то, что записано лучше всего через fatFS в режиме RO или аналог (как уже предлагали, да и сам ТС к тому же пришёл). В принципе можно предположить что ОС будет записывать сектора файла последовательно (и скорее всего так и будет), но полагаться на это нельзя. 8 minutes ago, haker_fox said: Как тогда работают загрузчики, обновляющие прошивку через USB MSC? Читают FAT, это не так сложно, как кажется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 47 минут назад, xvr сказал: Отличить состояния 'что то пишется' от 'всё записно' со 100% вероятностью нельзя в принципе - FAT никак не помечает окончание записи в файл (если мой склероз мне не изменяет). Вы забываете про запись о файле в директории. После модификации файла, драйвер ОС (как минимум) должен произвести коррекцию времени последней модификации и (опционально) размера файла. Конечно проблем с кешированием в ОС это не отменяет. Но, если в пишущей программе на ПК это предусмотреть, то в ней можно после завершения модификации файла, давать команду "flush" драйверу ОС. По которой он вроде как(?) должен сделать сброс данных на диск. 47 минут назад, xvr сказал: В принципе можно предположить что ОС будет записывать сектора файла последовательно (и скорее всего так и будет), но полагаться на это нельзя. Непонятно - почему все игнорируют время/дату последней модификации файла??? Если файл находится в корневой директории, то в FAT12/FAT16 её положение и размер - фиксированы. Прочитать её несложно руками, без всякой FatFS. И не надо читать и разбирать никаких таблиц и массивов секторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 18 minutes ago, jcxz said: После модификации файла, драйвер ОС (как минимум) должен произвести коррекцию времени последней модификации и (опционально) размера файла. После окончания записи - безусловно, но он может это делать и в процессе записи. Так что это не 100% надёжный вариант отследить именно окончание записи в файл. 20 minutes ago, jcxz said: Если файл находится в корневой директории, то в FAT12/FAT16 её положение и размер - фиксированы. Сама директория да, а вот кластеры файла - нет. Так что для чтения файла придётся по FAT ходить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Если уж писать свою программу записи файла, то правильнее будет по окончании записи отмонтировать устройство ("извлечь..."), это и будет сигналом для ОС, что все кэши необходимо сбросить на физический носитель, и для устройства, что запись окончена, и можно работать с файлом. Ещё вариант - заморочиться, и реализовать MTP протокол вместо Mass Storage, который оперирует уже не блоками, а файлами. Это, вероятно, самое правильное решение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба 4 minutes ago, gerber said: вероятно, самое правильное решение. в итоге будет прикручен FatFS от мистера Чана )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться