Как определить позицию Root Directory в FAT16?

Тема в разделе "WASM.ASSEMBLER", создана пользователем nin, 6 ноя 2004.

  1. nin

    nin New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    3
    Адрес:
    Netherlands
    Как определить позицию Root Directory в FAT16?с какого сектора она начинается?

    Пытался найти ответ в книге Advanced MS-DOS Programming(Ray Duncan) ...

    Везде очень хорошо описывается как найти позицию и size of sub directoriesи так же

    ещё много чего, но вот самого главного я не нашёл...



    Заранее благодарен,



    Ильдар
     
  2. nin

    nin New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    3
    Адрес:
    Netherlands
     
  3. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    Если память не изменяет - то к числу зарезервированных секотров (обычно 32) прибавить два раза размер FAT. а вообще, есть перевод официальной доки от мелкософта, там все описано. Прилагаю.

    [​IMG] _39038555__fatgen102_rus.zip
     
  4. nin

    nin New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    3
    Адрес:
    Netherlands
    Привет,



    Все никак не могу точно определить(наверно из-за малого опыта)

    Цель создать(с помощъю микроконтроллера PIC16F877 ) фаил на SD/ММС-card в который будет записыватся дата.

    На ММС - карту можно писать блоки по 512 баит, и читать от 1 до 512 баит.

    Фаил создаётся в RootDirectory с названием (допустим) measure.csv

    ММС карта будет заранее отформатированна под FAT16



    Примерно реализация будет выглядеть(поправте если где не прав...)вот так:

    1. Читаем первый сектор и заполняем ВРВ таблицу которая храница в RAM памяти. Эти вариаблы мы будем часто использовать.

    2. Теперь вычисляем с какого сектора начинается RootDirectory по формуле

    FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);

    3. читаю сектор который содержит RootDir в RAM, добавляю в RootDirectory новую Entry в которой прописываю Starting Cluster(Это адрес клустера с которого начинается sub-directory или его номер? если адрес, то как это реализуется, как я узнаю что сектор свободный, и существует ли для этого какойто алгоритм? Кажется что свободные сектора содержат F6 F6 F6 ). Пишу уже измененный сектор назад, то есть по адресу с которого я его прочел. В принципе я исхожу из того что карта форматированна, и расчитана на хранение только одного фаила measure.csv тоесть проверок никаких не требуется, значит пишу куда хочу...

    4. Пишу по какому то(подскажите???) адресу 2 сектора подряд (1 сluster == 1024 баит) причем не забываю прописать в заголовке кластера ссылку на предыдущии кластер(а что если он первый в ряду, из Entry я ссылаюсь на него???) и следующии. (Вот только я что-то не доганяю про это: -> The FAT maps the data region of the volume by cluster number. The first data cluster is cluster 2... если я правильно понимаю клустер 1 ето был сектор 0 ???? )

    5. Так пишу дату пока она не кончится и фаил нужно будет закрыть. Если это так, в последнем кластере надо записать вместо ссылки на следующии кластер флаг что он последнии.

    6. Опять прочесть сектор в котором лежит RootDirectory, наити Entry которое содержит имя measure.csv, изменить fileSize, заполнить там всякое другое (время создания, и.т.д.); записать этот сеkтор назад.

    7.конец



    Я ещё этого никогда не делал, поэтому всё выше написаное есть предложение как я это хочу сделать.



    Народ помогите чем можете, я уже 3 месяц с проэктом парюсь, всё остальное вроде понятно... вот только это...



    Заранее благодарен,



    Ильдар
     
  5. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    «3. читаю сектор который содержит RootDir в RAM, добавляю в RootDirectory новую Entry в которой прописываю Starting Cluster(Это адрес клустера с которого начинается sub-directory или его номер? если адрес, то как это реализуется, как я узнаю что сектор свободный, и существует ли для этого какойто алгоритм? Кажется что свободные сектора содержат F6 F6 F6 ).»



    Во первых, определись с понятиями сектор и кластер. Ты иногда используешь одно, а иногда другое, хотя это разные вещи.

    И какая разница между адресом кластера и номером? Вообще, там всегда подразумевается номер кластера, т.е., чтоб узнать абсолютное смещение от начала раздела в байтах, его надо умножить на кол-во байтов в кластере.

    Как узнать, который свободный... Кажется, следом за бут-блоком идет сектор, в конце которого записан номер последнего использованного кластера. Типа, для ускорения работы, чтоб драйверу ФС не лопатить каждый раз всю фат. Но полагаться на него не стоит... Лучше всего считывать всю ФАТ в память и перебирать все записи в поиске нулевой. Если запись равна нулю, значит соответствующий ей кластер свободен. Но к номеру кластера в фат надо приплюсовать еще число кластеров, занятых RootDir, помножить все на число байт в секторе, плюс еще сам фат (два раза) и бутблок – так узнаешь смещение до свободного кластера в байтах от начала раздела. Т.е, элемент фат показывает не номер кластера в разделе, а номер кластера в области данных. Улавливаешь?



    « В принципе я исхожу из того что карта форматированна, и расчитана на хранение только одного фаила measure.csv тоесть проверок никаких не требуется, значит пишу куда хочу...»



    А чего ты вообще тада паришься? Карточка твоя всегда одинакового размера будет? Если да – проведи эксперимент. Затри всю карту нулями, вместе с бутсектором и фатом, всю. Потом форматируешь. Сохраняешь образ карты в файл. Записываешь на карту файл размером, к примеру, 400 байт. Сохраняешь образ карты в файл. Увеличиваешь размер файла с 400 до, например, 4k байт. Сохраняешь образ карты в файл. А потом берешь и внимательно изучаешь(с помощью того же TotalCommander, он умеет сравнивать файлы), чем пустая карта отличается от карты с файлом, и что меняется в ФАТе и в области данных при увеличении размера файла. Может быть, для тебя это будет проще, чем изучать доку по ФАТ. По крайней мере, я примерно так делал – читал доку, потом предлагал ОС самой поработать с диском, внимательнейшим образом следил за ее действиями, потом опять читал доку.



    «4. а что если он первый в ряду, из Entry я ссылаюсь на него»

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

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    nin

    Свободный кластер надо искать в FAT-таблице.

    Она содержит номер следующего кластера,

    признак последнего кластера или признак

    свободного кластера. Какие коды не помню :

    ищи в доках или просто посмотри.

    Очень хорошо все что ты спрашиваешь

    показывает diskedit из Norton Utilties.

    И где root и что в FAT ...
     
  8. HENMEN

    HENMEN New Member

    Публикаций:
    0
    Регистрация:
    22 май 2006
    Сообщения:
    4
    Ok. может мне тоже доку скините?
     
  9. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615