Преобразование номера кластера, хранящегося в таблице FAT (файловой системы FAT12) для чтения с дискеты

Я пишу двухэтапный загрузчик для файловой системы FAT12. Stage1 загрузчика загружает stage2 с дискеты, которая находится в файловой системе FAT12. Теперь у меня возникла проблема с преобразованием номера кластера (который я получил из таблицы FAT) в формат, содержащий номер дорожки, заголовка и сектора. Я следил за учебником http://www.brokenthorn.com/Resources/OSDev6.html для того, чтобы сделать загрузчик.

Меня беспокоит то, что в учебнике номер кластера, полученный из FAT, сначала преобразуется в формат LBA (линейный адрес блока), а затем преобразуется в формат CHS (сектор головки цилиндра) перед чтением сектора в память.

Почему я не могу напрямую преобразовать номер кластера в формат CHS ?? Таблица FAT не хранит номера кластеров линейно ?? Я хочу точно знать, что мне здесь не хватает?

Ссылка на исходный код загрузчика, используемого в руководстве, находится в конце страницы ссылки http://www.brokenthorn.com/Resources/OSDev6.html.


person Saurav Deb Purkayastha    schedule 09.02.2013    source источник


Ответы (2)


Номера кластеров линейны, но, как уже упоминалось ранее, относятся к области данных, причем кластер 2 является первым кластером области данных. Однако чтение с диска осуществляется в единицах секторов диска, и каждый кластер FAT может содержать несколько секторов - для этого и используется преобразование в LBA - для преобразования номера кластера в номер сектора. (так, вычтите 2 из требуемого номера кластера - чтобы учесть, что кластер 2 является первым кластером области данных, затем умножьте на количество секторов диска в кластере, а затем добавьте количество используемых секторов диска перед областью данных , чтобы определить абсолютный сектор (-ы) диска, в котором хранятся наши данные.

Однако более старые функции BIOS int 0x13 не считывали с диска абсолютные секторы - они считывали определенный сектор определенной головкой на определенном цилиндре (http://en.wikipedia.org/wiki/Cylinder-head-sector). Поэтому, если вы используете эти функции, вам необходимо предпринять дополнительный шаг для определения того, какой цилиндр / головка / сектор соответствует абсолютному сектору, который вы хотите прочитать. Альтернативой является - если возможно - использование функции расширенного чтения int 0x13, которая принимает адреса абсолютных секторов (LBA) напрямую.

person Michael    schedule 09.02.2013

LBA и CHS используются для однозначной идентификации всех физических секторов на диске.

Номер кластера, OTOH, имеет смысл только внутри раздела, он относительно начала раздела (его области данных) и может однозначно идентифицировать блоки более чем одного сектора внутри раздела.

Итак, между этими двумя вещами есть некоторая разница, хотя их функции схожи.

А оборудование (или BIOS) ничего не знает и не должно знать о кластерах. Итак, вам нужно преобразовать номера кластеров в LBAs (а затем, возможно, в CHS), чтобы получить доступ к данным на устройстве хранения.

person Alexey Frunze    schedule 09.02.2013
comment
Когда вы говорите, что номер кластера, ...., относительно начала раздела (его области данных) ... вы имеете в виду, что номер кластера в таблице FAT относится к началу области данных FAT12 после корневого каталога ?? - person Saurav Deb Purkayastha; 09.02.2013
comment
См. Официальную документацию Microsoft по FAT12 / 16/32, fatgen103.doc . - person Alexey Frunze; 09.02.2013
comment
Я немного запутался в этом. Я понял, что FAT предоставляет номер кластера относительно начала области данных. Итак, теперь, если моя область данных начинается с кластера 32 (загрузочный сектор, FAT1, FAT2, RootDirectory используют 32 сектора, а у меня 1 сектор / кластер), и я получил кластер номер 4 из таблицы FAT, тогда как мне рассчитать линейный адрес кластер? Если я помещу это в формулу (кластер-2) * секторыПерКластер, я получу ответ как кластер 2, что, очевидно, неверно. Подскажите, пожалуйста, какой именно номер кластера в таблице FAT ?? - person Saurav Deb Purkayastha; 09.02.2013
comment
Очевидным способом в этой ситуации было бы добавить номер кластера из FAT в начальный кластер области данных (например, 31). Но я знаю, что это неправильный путь. Я не могу точно понять, какой номер кластера предоставляет FAT. Пожалуйста помоги! - person Saurav Deb Purkayastha; 09.02.2013
comment
Номера кластеров начинаются с 2, AFAIR, причем 0 и 1 зарезервированы. Кластер 2 - это первый кластер в области данных. Он не отражает размер предыдущих частей, таких как загрузочный сектор, копии таблицы распределения и корневой каталог. - person Alexey Frunze; 09.02.2013
comment
Хорошо .. Итак, когда у меня есть кластер номер 4, это означает, что мне нужно получить доступ к кластеру 4 области данных? Но когда я вижу диск в целом и хочу получить доступ к кластеру 4, не следует ли мне делать startCluster (область данных) + Номер кластера ?? [Извините за то, что не поняли легко!] - person Saurav Deb Purkayastha; 09.02.2013
comment
Вы вычитаете 2 из номера кластера, умножаете это на количество секторов в кластере, и это номер сектора в области данных. FirstSectorofCluster = ((N – 2) * BPB_SecPerClus) + FirstDataSector; - формула в документе. Начните читать документ. Это все есть. Читайте внимательно и думайте. - person Alexey Frunze; 09.02.2013
comment
Я получаю это сейчас! Я пропустил эту строку, которую вы сказали, что кластер 2 - это первый кластер в области данных. Я думал, что 0 и 1 кластера зарезервированы в области данных. Но на самом деле номера кластеров 0 и 1 зарезервированы, и поэтому кластер номер 2 соответствует 1-му кластеру в области данных и, следовательно, (N-2) в формуле !! Спасибо @Alexey Frunze .. :-) - person Saurav Deb Purkayastha; 09.02.2013
comment
Зарезервированы только эти два значения и две соответствующие записи в самой таблице распределения. Секторы данных не теряются из-за этого 2. - person Alexey Frunze; 09.02.2013