OSDev

для всех
Текущее время: 28 апр 2024, 23:45

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: вычисление FAT LBA записи
СообщениеДобавлено: 02 авг 2014, 23:10 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
пробовал качать папки и файлы в оперативку,
и столкнулся с проблемкой, root dir или FirstRootDirSecNum имеет нормальный адрес,
но вот остальные не и меют такой нормальный адресь примерно на 2 кластера больше
так вот для уточнения хотел спросить как этот стартовый кластер вычислить,
???????????????????????
startLBA = FirstRootDirSecNum + RootDirSectors/2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вычисление FAT LBA записи
СообщениеДобавлено: 02 авг 2014, 23:34 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
Казалось бы, всё чётко написано:
http://wiki.osdev.org/FAT#Reading_Directories

Ну если чего-то непонятное в их коде есть - спрашивай более конкретно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вычисление FAT LBA записи
СообщениеДобавлено: 02 авг 2014, 23:37 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
если ты про это
Цитата:
absolute_cluster = relative_cluster - 2 + first_data_sector;

так оно не работае.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вычисление FAT LBA записи
СообщениеДобавлено: 02 авг 2014, 23:50 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
Спокойно. Во-первых, похоже что `2' в коде - не константа, а root_cluster. Далее, хм, чем больше читаю, тем больше кажется что смешались в кучу кластеры и сектора. Мде, до этого момента статья довольно чётко была написана.
Собственно, сегодня ковырял https://raw.githubusercontent.com/jncro ... ster/fat.c , нашёл там одну ошибку, сверился со статьёй, поправил ошибку в локальной копии и дальше всё заработало.
Код:
uint32_t get_sector(struct fat_fs *fs, uint32_t rel_cluster)
{
#ifdef FAT_DEBUG
   printf("FAT: get_sector rel_cluster %i, sector %i\n",
         rel_cluster,
         fs->first_non_root_sector + (rel_cluster - 2) * fs->sectors_per_cluster);
#endif
   rel_cluster -= 2;
   return fs->first_non_root_sector + rel_cluster * fs->sectors_per_cluster;
}

Где для FAT32:
Код:
      ret->first_data_sector = bs->reserved_sector_count + (bs->table_count *
         bs->ext.fat32.table_size_32);
      ret->first_fat_sector = bs->reserved_sector_count;
      ret->first_non_root_sector = ret->first_data_sector;
      ret->sectors_per_fat = bs->ext.fat32.table_size_32;

А для 12/16:
Код:
      ret->first_data_sector = bs->reserved_sector_count + (bs->table_count *
            bs->table_size_16);
      ret->first_fat_sector = bs->reserved_sector_count;
      ret->sectors_per_fat = bs->table_size_16;

      ret->first_non_root_sector = ret->first_data_sector + ret->root_dir_sectors;
      ret->root_dir_cluster = 2;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вычисление FAT LBA записи
СообщениеДобавлено: 03 авг 2014, 11:14 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Отвечу подробно, если мне кто-нибудь расшифрует название темы.

Edited. Первый физический кластер имеет номер 2. Может, проблема в этом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вычисление FAT LBA записи
СообщениеДобавлено: 03 авг 2014, 17:57 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
phantom-84 писал(а):
Отвечу подробно, если мне кто-нибудь расшифрует название темы.

Edited. Первый физический кластер имеет номер 2. Может, проблема в этом.

по пробую перевести, вычисление адреса файла (LBA),

Nable уже дал потрясающий ответ.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB