OSDev
http://osdev.su/

вычисление FAT LBA записи
http://osdev.su/viewtopic.php?f=6&t=990
Страница 1 из 1

Автор:  scuter [ 02 авг 2014, 23:10 ]
Заголовок сообщения:  вычисление FAT LBA записи

пробовал качать папки и файлы в оперативку,
и столкнулся с проблемкой, root dir или FirstRootDirSecNum имеет нормальный адрес,
но вот остальные не и меют такой нормальный адресь примерно на 2 кластера больше
так вот для уточнения хотел спросить как этот стартовый кластер вычислить,
???????????????????????
startLBA = FirstRootDirSecNum + RootDirSectors/2

Автор:  Nable [ 02 авг 2014, 23:34 ]
Заголовок сообщения:  Re: вычисление FAT LBA записи

Казалось бы, всё чётко написано:
http://wiki.osdev.org/FAT#Reading_Directories

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

Автор:  scuter [ 02 авг 2014, 23:37 ]
Заголовок сообщения:  Re: вычисление FAT LBA записи

если ты про это
Цитата:
absolute_cluster = relative_cluster - 2 + first_data_sector;

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

Автор:  Nable [ 02 авг 2014, 23:50 ]
Заголовок сообщения:  Re: вычисление FAT LBA записи

Спокойно. Во-первых, похоже что `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;

Автор:  phantom-84 [ 03 авг 2014, 11:14 ]
Заголовок сообщения:  Re: вычисление FAT LBA записи

Отвечу подробно, если мне кто-нибудь расшифрует название темы.

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

Автор:  scuter [ 03 авг 2014, 17:57 ]
Заголовок сообщения:  Re: вычисление FAT LBA записи

phantom-84 писал(а):
Отвечу подробно, если мне кто-нибудь расшифрует название темы.

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

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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/