Golikov 0 24 ноября, 2009 Опубликовано 24 ноября, 2009 · Жалоба Привет народ! Мне надо быстро прояснить несколько вопросов по ФАТ, уж не знаю где это спросить. Боюсь в форуме для чайников быстро прояснить не выйдет:)... есть СД карта, и на ней надо насобачить фат16, в нем огромный файл, а в нем записать данные в своем формате.. вопросы: 1. Спецификация SD рекомендует делать в начале несколько скрытых секторов, я так понял для того чтобы выровнить область данных по кластерам. Это так? 1.1 Если да то это обязательно? 2. Можно форматировать SD карту как дискету, то есть в 0 сектор положить не MBR а BootSector? 2.1 Если да, то надо ли менять в описании бут сектора тип носителя с 0xF8 (несменный носитель типа винчестер) на какой то другой код? 2.2 Если да, то надо ли в 0 записе FAT тоже заменить код? 2.3 Значения головки, целиндры, стороны, имеют смысл для СД карты, проверяются/используются где то? 3. Если отформатировать карту в виндоус, ее размер задается больше чем размер считанный из CID, откуда виндоус узнает размер карты? (Винда определяет на 1024 секторов больше чем ИД для карты 2 Гб) 4. Если отформатировать карту, и записать на нее файл занимающий все место, то виндоус при попытке читать/копировать файл, говорит что файла нет или он испорчен, и помечает диск как испорченый в 1 записи FAT. Тестами выяснил что писать можно только на 1 кластер меньше чем всего места (виндоус пытается какие то файлы создавать темповые при копировании и попытке открыть файл). Причем этот кластер учитывается, то есть создав файл на 1 кластер меньше чем всего места на карте виндоус пишет что свободного места нет. Естественно это все с учетом места занимаемого служебными данными. Я что-то пропустил в спецификации или это чисто прикол винды? 4.1 Если для заполненой карты как в пункте 4, то есть ту которую винда признает неработающей, переписать МБР увеличив запись о количестве свободного места на ней, то она начинает работать. То есть либо там и правда больше места чем надо, либо я чего то не понимаю. Причем свободного места на карте написано 0... Это какое то искуственное увеличение карты чтобы не терять последний сектор? 4.2 Зарезервированные сектора надо как то учитывать? То есть если у нас есть места под данные 4 кластера, то я делаю таблицу размером на 6 кластеров, вторая запись становится указателем на 0 кластер данных, а 5 запись на 4 кластер данных? Или я что-то не понял и это как то должно дать тот 1 лишний кластер которого мне не хватает? Сори за банальную тему, ответы как всегад нужны уже вчера..., если можно пишите краткие ответы, а не посылайте в дебри форума... Зарание спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gryphus 0 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба Почему бы Вам не использовать готовую реализацию FAT, например, эту. Большинство вопросов отпадут. И зачем заполнять данными всю карту под завязку, раз уж с этим какие-то неясности? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба Скорее всего, винда узнает размер карты (точнее, тома) из структуры в конце первого сектора карты - после записи "мусора" в первый сектор винда определяет карту размером 512 байт, не форматирует, и я не знаю как это победить средствами винды :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба есть СД карта, и на ней надо насобачить фат16, в нем огромный файл, а в нем записать данные в своем формате.. Размеры файлов,как и их количество, и равно размер "диска", ограниченны конкретной файловой системой. Ознакомьтесь с FAT16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба Может, не заморачиваться с записью FAT'а, отформатировать под виндой, там же положить нужный файл, и уж туда "собачить" свои данные ?.. Проблемы с совместимостью останутся на совести Гейтса :) Карточки без MBR я видел. Какой там тип носителя, не помню. Вполне возможно, что обычный HDD. Детально размер собственно карты и размер разделов на ней никогда не сравнивал (гигабайты сходятся, и ладно :) ), поэтому ничего не подскажу. Реализацию FAT'а на SD уже обсуждали. В "интерфейсах", как минимум. Но там тоже без таких подробностей, насколько помню... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба Размеры файлов,как и их количество, и равно размер "диска", ограниченны конкретной файловой системой. Ознакомьтесь с FAT16. Потому изначально тема и была не в вопросе для новичков. Это не детские вопросы. По регистру CID я узнал размер карты получил 3841024 сектора. Задал бут сектор, табллицы фат, рут директорию. остальное место отвел под данные. так вот если все оставшиеся место забить данными, создать файл, заполнить фат, указать файлу размер (общий размер карты из CID - служебная запись). Такая карта не будет читаться в виндоус. Если сделать размер файла на 1 кластер меньше, карта будет читаться и места на диске будет написано 0. Дальше если форматировать карточку виндой, виндоус ставит ей размер 3842048 секторов, и созданый файл размером (3841024-служебные сектора) нормально читается, но оставшегося места на карте все равно 0. Если форматировать карту программой панасоника, она задает карте размер 3841774 и 137 скрытых секторов, то есть общий размер 3841911 и не как в CID и ни как в винде... Откуда берется этот размер? Это все вкладывается в ограничение ФАТ16, не в этом дело. Не в этом вопрос! Как узнать размер СД карты, истинный, откуда виндоус и панасоник бирут размер карты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба Как узнать размер СД карты, истинный, откуда виндоус и панасоник бирут размер карты? Размер карты в секторах и в байтах рассчитывается на основе Card Specific Data (CSD) Register. C_SIZE (Device Size)—computes the card capacity. The memory capacity of the card is computed from the entries C_SIZE, C_SIZE_MULT and READ_BL_LEN as follows: memory capacity = BLOCKNR * BLOCK_LEN Where: BLOCKNR = (C_SIZE+1) * MULT MULT = 2C_SIZE_MULT+2 (C_SIZE_MULT < 8) BLOCK_LEN = 2READ_BL_LEN (READ_BL_LEN < 12) Therefore, the maximum capacity that can be coded is 4096*512*2048=4 GB. For example, a 4-MB card with BLOCK_LEN = 512 can be coded with C_SIZE_MULT = 0 and C_SIZE = 2047. Только надо учитывать, что существует две версии CSD регистра. Почитайте вот этот документ: Simplified_Physical_Layer_Spec.rar А винда уже высчитывает свободное место на карте исходя из установленной файловой системы, размеров кластера, FAT и т.д. Имхо, не стоит этим заморачиваться :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 ноября, 2009 Опубликовано 25 ноября, 2009 · Жалоба Размер карты в секторах и в байтах рассчитывается на основе Card Specific Data (CSD) Register. ... А винда уже высчитывает свободное место на карте исходя из установленной файловой системы, размеров кластера, FAT и т.д. Имхо, не стоит этим заморачиваться :) Спасибо… у меня есть полная версия описания, да конечно я перепутал и обозвал CSD - CID, именно по этому расчету у меня получается объем на 1024 сектора меньше чем рассчитывает винда, и где то на 500-600 секторов меньше чем рассчитывает программка от панасоника. Вот такие чудеса... В полном описании написано, что в этом регистре лежит размер без секретной и защищенной области... может панасоник как один из авторов умеет рассчитывать полный размер... а в 2 словах что за вторая версия регистра CSD? Разобрался в чем была беда с размером файла и диска. У меня не были выровнены данные по кластерам, и последний кластер был не полный, я его включал в размер файла, а винда неполные сектора на конце исключает... Это приводило к тому, что размер файла становился больше чем размер диска (винда размер диска пересчитывает, не верит записи в бут рекорде на слово) и диск объявлялся бракованным... Поэтому лучше сектора, неполного последнего кластера, которые так и так пропадут запихать в невидимую область диска в начале, и организовать там МБР, как и делает производитель карт при собственном формате... Но только придется бут сектор искать посложнее… И попутно еще выяснил, что винда проверяет нулевой сектор, если там есть сигнатура 55АА, то проверяет начало, если есть запись 00, то считает сектор МБРом и верит его данным при формате. А если не находит сигнатуры то пихает в 0 сектор сразу бут сектор. Причем верность записи МБР как то проверяется, изменяя в винхексе запись МБР, в частности размер карты, то получал диалоги винды при приглашении к форматированию с данными что карта из 1.83 стала 2.22 гигабайта, то получал неформатированный диск и при формате замену МБР на бут сектор с собственно рассчитанным виндой значением размера карты. Иногда она оставляла МБР с неверной записью размера и делала бут сектор с рассчитанными значением размера карты… если есть сигнатура, но в начале не нули, то карта считается неформатированной, если там конечно не 0xEB в начале, что является признаком бут сектора (как я понимаю)... вот такое исследование :)... может кому пригодится… Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 26 ноября, 2009 Опубликовано 26 ноября, 2009 · Жалоба а в 2 словах что за вторая версия регистра CSD? Это у больших карт размером до 32 Гб, у них размер считается по другому: C_SIZE This field is expanded to 22 bits and can indicate up to 2 TBytes (It is the same as the maximum memory space specified by a 32-bit block address.) This parameter is used to calculate the user data area capacity in the SD memory card (not include the protected area). The user data area capacity is calculated from C_SIZE as follows: memory capacity = (C_SIZE+1) * 512K byte As the maximum capacity of the Physical Layer Specification Version 2.00 is 32 GB, the upper 6 bits of this field shall be set to 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться