┬I.2.2. Таблицa Размещения Файлов ┬ Как Вы считаете, следует писать ┬ сэнд╨ вич или сандвич? ┬ Да зачем нам вообще этот иноземный тер╨ мин, если существует прекрасное русское слово ┬ "бутерброд"? Народный фольклор Для двухстороннего диска в секторах с номерами 1╤3 и 4╤6 содержится ┼Таблица Размещения Файлов (FAT-"File Allocation Table"),─ в которой рас╨ полагается информация о размещении файлов на дискете. Сектора 1╤3 и сектора 4╤6 - это две копии одной и той же Таблицы Размещения Файлов. \/T0/1 ─┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬│ ┴0 сектор┴1 сектор┴2 сектор┴3 сектор┴4 сектор┴5 сектор┴6 сектор┴ ┌┬┬▌┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┐ ┴ ┴░┬┬┬┬┬┬┬┬┬ FAT ┬┬┬┬┬┬┬┬┬┬▐┴░┬┬┬┬┬┬ Копия FAT ┬┬┬┬┬┬┬▐┴ ┴ \/T1/1- Загрузочный сектор ("Boot sector") Если же диск отформатирован как ┌односторонний─ ("Single"), то FAT за╨ нимает уже не 3, а 2 сектора, и размещается в секторах 1╤2, а копия - в секторах 3╤4. \/T0/1 ─┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬│ ┴0 сектор┴1 сектор┴2 сектор┴3 сектор┴4 сектор┴ ┌┬┬▌┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┐ ┴ ┴░┬┬┬┬┬ FAT ┬┬┬┬┬▐┴░┬┬ Копия FAT ┬┬▐┴ ┴ \/T1/1- Загрузочный сектор ("Boot sector") Предполагается, что копии Таблицы Размещения Файлов должны быть идентичными. Хранение двух экземпляров Таблицы Размещения Файлов пред╨ ставляет собой простую предосторожность, связанную с большой важностью информации, содержащейся в таблице. Восстановление поврежденной FAT представляет собой непростую задачу. Для Таблицы Размещения Файлов выделено 4 (или 6) секторов не столько для того, чтобы хранить две копии, сколько для обеспечения возможности увеличения этой Таблицы в будущем. ┼Основной принцип─ организации Таблицы Размещения Файлов заключается в создании таблицы, каждый элемент которой соответствует одному кластеру. ┼Элементы таблицы содержат признаки занятости кластера─. ┼Доступные─ (свободные) элементы таблицы содержат ┼нулевые─ значения. Участки пространства на дискете, принадлежащие одному файлу, связаны в ┼цепочку─. Опишем организацию этой цепочки. Во-первых, определенный элемент ┼Справочника─ файла (см. ниже раздел I.2.3) содержит номер элемента в Таблице Размещения Файла, который со╨ ответствует первому из кластеров, выделенных для файла. Во-вторых, каждый элемент Таблицы Размещения Файлов содержит номер ┼следующего─ кластера файла и так далее, пока не будет достигнут послед╨ ний кластер файла. В-третьих, в последнем элементе Таблицы Размещения Файлов для данно╨ го файла находится ┼признак конца файла─. Некий поэт спросил, нравится ли Шамфору на╨ писанное им двустишье. "Очень,- заявил Шам╨ фор,- только нельзя ли его сократить?" С.Шамфор. Характеры и анекдоты Нумерация элементов Таблицы Размещения Файлов начинается с 2. Это означает, что первые два элемента Таблицы Размещения Файлов (с номерами 0 и 1) не используются для хранения информации о размещении данных. Они зарезервированы для хранения очень важной информации ┬ ┌сведений о фор─╨ \/T0/1 ┌мате дискеты─. ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ ┼Код формата хранится в первом─ ┴ ┴ ┼байте Таблицы Размещения Файлов─ ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1- Теперь можно подробно рассмотреть ┌кодировку─ информации в Таблице Размещения Файлов. Вам, конечно уже известно, что на двухсторонней дис╨ кете для Области данных отведено 713 кластеров. Элемент Таблицы Размещения Файлов должен позволять хранить номер другого элемента Таблицы (┌номер кластера─, а максимальный номер, который может храниться в одном байте равен всего OFFh=255, следовательно, дли╨ на элемента Таблицы должна быть ┌больше─ одного байта. С другой стороны, если бы длина элемента Таблицы Размещения Файлов была равна ┌двум─ байтам (максимальный номер, который может храниться в двух байтах равен OFFFFh = 65535), то с учетом того, что FAT занимает 3 сектора на дискете (3╧512 = 1536 байт), мы получим, что можно закодиро╨ вать 1536/2=768 кластерoв, что вполне достаточно для этого типа дискет, но на поиск нужной ячейки будет уходить в два раза больше времени, чем при однобайтном кодировании. Истина, как всегда, находится посредине! Для решения этой проблемы была разработана довольно сложная схема представления элементов FAT в виде ┌трех─ шестнадцатеричных цифр, занима╨ ющих ┌полтора байта─ (12 двоичных разрядов) на дискете. Всего же таким способом можно закодировать 1024 кластера. \/T0/1 ─┬┬┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬├┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ 0-й байт ┴ 1-й байт ┴ 2-й байт ┴ 3-й байт ┴ ... ┴ 1535-й байт ┴ ┴ FAT ┴ FAT ┴ FAT ┴ FAT ┴ ┴ FAT ┴ ┌┬┬┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┤┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┬┬┬┐ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ Информация о формате дискеты \/T1/1- Схема хранения чисел в виде полуторабайтных кодов выглядит довольно странно для программиста, хотя использование этого факта на машинном языке реализуется очень просто. Последовательные элементы Таблицы Размещения Файлов разбиваются на пары, объединяющие два полуторабайтовых значения в последовательность из трех байтов для каждой пары. Для получения значения, хранящегося в элементе Таблицы Размещения Файлов с номером X, нужно выполнить следующие действия: 1) умножить X на 1.5 (для этого выполняется умножение на 3 с после╨ дующим делением на 2), прибавить 3 и найти целую часть полученного зна╨ \/T0/1 чения: M := [X╧1.5+3] \/T1/1- 2) байты с адресами M и M+1 можно теперь загрузить в шестнадцатибит╨ ный регистр микропроцессора (кто не знает ассемблера микропроцессора Z80 - не бойтесь: это не больно!). Теперь в регистре находится четыре шестнадцатеричных цифры, а необходимы только ┌три─ из них. Если номер элемента Таблицы Размещения Файлов нечетный, то нужно от╨ бросить ┌последнюю─ цифру, а если он четный - то ┌первую. \/T0/1 Старший бит ┬┬│ ─┬┬┬ Младший бит (номер 7) █ █ (номер 0) ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ 3-й байт FAT ┴ 07 06 05 04 03 02 01 00 ┴ └┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴░┬┬┬ 0-й элемент FAT 4-й байт FAT ┴ 03 02 01 00 ┴11 10 09 08 ┴ ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ 5-й байт FAT ┴ 11 10 09 08 07 06 05 04 ┴░┬┬┬ 1-й элемент FAT └┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ 6-й байт FAT ┴ 07 06 05 04 03 02 01 00 ┴ └┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴░┬┬┬ 2-й элемент FAT 7-й байт FAT ┴ ┴11 10 09 08 ┴ ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ... ┴ ... ┴ ... └┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ 1534-й байт FAT ┴ 03 02 01 00 ┴ ┴ ┴ ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ 1535-й байт FAT ┴ 11 10 09 08 07 06 05 04 ┴░┬ 1021-й элемент FAT ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1- Элементы FAT с содержимым 2CBh╤FFFh обозначают особые типы ┼зарезер─╨ ┼вированных─ кластеров, например, EEEh в MSX-DOS используется для выделе╨ ния кластеров с дефектными секторами. Дело в том, что на поверхности дискеты могут встречаться участки с дефектами магнитного покрытия, ко╨ торые нельзя эффективно использовать для хранения данных. В организации Таблицы Размещения Файлов могут возникать определенные дефекты. Два наиболее заметных дефекта ┬ это ┼"беспризорные" кластеры─ и ┼перекрещивающиеся файлы─. Если элемент Таблицы содержит значение, указывающее, что элемент ис╨ пользуется (значение не равно нулю) и, в то же время, этот элемент не входит ни в одну из цепочек определения размещения файлов, то такой элемент Таблицы Размещения Файлов становится как бы ┼"беспризорным"─. "Беспризорные" кластеры чаще всего возникают, когда программы начинают создавать файл (так что для него выделяются кластеры), но не закрывают его, вследствие чего не завершается создание элемента Справочника для данного файла. Во втором случае, может случиться так, что две (или более) различные цепочки, определяющие размещение файлов, приводят к одному и тому же кластеру. Такие файлы называются ┼перекрещивающимися─. Если "беспризорные" кластеры встречаются достаточно часто, то перек╨ рещивающиеся файлы возникают очень редко. Если такая ситуация все же Вам встретится, нужно скопировать каждый из файлов на другую дискету для последующего восстановления (если оно потребуется). После этого ко╨ пии всех файлов будут содержать информацию из общих секторов, хотя она может принадлежать только одному из них. При работе MSX-DOS в памяти хранится копия Таблицы Размещения Файлов для каждого используемого дисковода (см. раздел I.2.1). Когда в Таблице производится какое-либо изменение, оно записывается в обе копии на дис╨ кете. При новом обращении к дискете MSX-DOS считывает Таблицу Размеще╨ ния Файлов, чтобы установить формат дискеты.