ZX-Files #01
29 декабря 2000 |
|
Несколько слов о MS-DOS. Немало времени прошло с тех пор когда я написал свой MSCOM v0.0 . Вообще задумка была неплохая, но как известно, первый блин комом. Вообще главной отличительной чертой моего MSCOM'а было то, что она, согласно идее, должна была учитывать все особенности MSDOS, и в частности сегмен- тацию файлов. (Этим кстати и об'ьясняет- ся тормознутость дисковых операций как в IS-DOS'е так и в MSCOM'е.) И по сей день ни одна программа конвертящая с писюка, кроме этих двух, не поддерживает сегмен- тацию файлов. Поскольку я еще не скоро возьмусь за переписывание MSCOM'а, то я решил выдать информацию по MSDOS, дабы если найдется молодец который захочет написать очередной конвертор,я хочу что- бы он пр принял все к сведению и не сот- ворил очередной лейм. Да, кстати, все пишу по памяти, и по этому 100%-ю точ- ность не гарантирую. 1.1 Общая информация. Оговорюсь сразу: Вся информация приведе- на для формата MSDOS диска на 720, как единственно пригодного для чтения на спектруме. Итак: формат MSDOS диска имеет следую- щую структуру: 1. Размер сектора: ....... 512 байт. 2. Кол-во секторов в треке: 9 3. Кол-во треков: ........ 80 (160) Так же стоит заметить, что если вы ре- шили вдруг написать MSDOS форматтер, то первый синхропробел делайте побольше, иначе вы обречены на нечтение первого сектора на PC. 1.2 Системный сектор. Нулевой сектор на нулевом треке явля- ется системным. В нем записана важная информация о структуре диска в целом, фаиловой и физической структуре оного. Эта информация называется Block Parametrs of BIOS (BPB). Вот ее вид: +12 SectSiz : Word; Количество байт в секторе. Всегда со- держит 512. +14 ClustSize : Byte; Количество секторов в кластере (см.ни- же). Для формата 720 всегда содержит 2. +15 ResSect : Word; Кол-во секторов перед FAT. (см. ниже) +17 FatCnt : Byte; Кол-во копий FAT. обычно 2 для диска. +18 RootSiz : Word; Кол-во элементов корневого каталога. +20 TopSecs : Word; Кол-во секторов на диске. +22 Media : Byte; Дескриптор носителя. +23 FatSize : Word; Размер FAT в секторах. Поле Media определяет тип носителя ин- формации: ╔════╤═════════════════════════════╗ ║ Бит│ Признак ║ ╟────┼─────────────────────────────╢ ║ 0 │ Двух/односторонний носитель.║ ╟────┼─────────────────────────────╢ ║ 1 │ 8/не 8 секторов на треке. ║ ╟────┼─────────────────────────────╢ ║ 2 │ Винчетер/Дисковод ║ ║ │ ║ ╚════╧═════════════════════════════╝ Сразу за BPB содержится следующая ин- формация: +25 TrkSecs : Word; Кол-во секторов на дорожке; +27 HeadCnt : Word; Кол-во головок устройства; +29 HidnSecs : Word; Кол-во спрятанных секторов. Дальнейшая структура относится к вин- честеру, и здесь описывать ее не имеет смысла. 1.3 FAT - структура. За загрузочным сектором располагается так называемая FAT-структура. Начало ее можно узнать, отступив от начала диска количество секторов, которое содержится в поле ResSecs (из BPB). FAT (File Allocation Table) - важнейшая структура на диске. Как следует из наз- вания, FAT содержит информацию о распо- ложении файлов. Теперь позвольте мне сделать лирическое отступление. Весь диск в формате MS-DOS делится на так называемые кластеры. Кластер представляет собой группу смеж- ных секторов (1 или более, в нашем слу- чае, при формате на 720, - 2). Кластер - это элементарная единица в системе MS-DOS, т.е. это меньшее что вы сможете считать с диска. Кластер определяется его абсолютным номером и при формате на 720 этот номер задается 12-и битным чис- лом. Вернемся к FAT. Итак, из всего вышеска- занного следует что FAT определяет при- надлежность кластеров к своим файлам, и вот как это устроено: FAT-структура со- держит цепочки ссылок: где-то в описате- ле файла содержится номер его первого кластера, программа берет этот номер, считывает в память соответствующий ему кластер, и дальше заглядывает в ячейку FAT с этим же номером, а в этой ячейке содержится номер следующего кластера, одновременно являющийся ссылкой далее. Так программа потихоньку считывает файл пока вместо номера очередного кластера не достанет из FAT управляющий код конца чтения. ┌───────┬┬───┬┬┬┬┬┬┬┬┬───┬───┬──┬─────┐ │ Myfile txt │tim│dat│02│Длина│ └───────┴┴───┴┴┴┴┴┴┴┴┴───┴───┴╫─┴─────┘ ╔══════════════════════╝ ┌──┬──┬──┬──┬──┬──┬──┬─────┐ │ID│FF│03>04>05>08│1E│09>FF│ └──┴──┴──┴──┴──┴─║┴──┴ ^ ──┘ ╚═════╝ В структуре FAT используются следующие управляющие коды: от #FFO до #FFб - Кластер зарезервиро- ван. #FF7 - Сбойный кластер. от #FF8 до #FFF конец файла. Напоминаю что элементы FAT 12-и битные, и в три байта помещается ровно два эле- мента. Ну вот, пожалуй с самым сложным разобрались. В заключении этой главы хо- чу лишь добавить, что на диске обычно бывает несколько копий FAT, что обеспе- чивает надежность сохранности информа- ции. 1.4 Структура каталогов. Сразу за последней копией FAT располо- гается корневой каталог, содержащий опи- сатели зарегестрированных в нем подката- логов и файлов. Каждый элемент каталога описываетя 32-х байтной структурой дан- ных: ╔═══╤═══════╤═════╤════════════════════╗ ║См.│ Поле │Длина│ Смысл ║ ╟───┼───────┼─────┼────────────────────╢ ║+00│ Name │ 8 │ Имя файла. ║ ╟───┼───────┼─────┼────────────────────╢ ║+08│ Ext │ 3 │ Расширение. ║ ╟───┼───────┼─────┼────────────────────╢ ║+11│ Fattr │Byte │ Атрибуты файла. ║ ╟───┼───────┼─────┼────────────────────╢ ║+12│Reserv │ 10 │ 10 байт Бреда. ║ ╟───┼───────┼─────┼────────────────────╢ ║+22│ Time │Word │ Время создания. ║ ╟───┼───────┼─────┼────────────────────╢ ║+24│ Date │Word │ Дата создания. ║ ╟───┼───────┼─────┼────────────────────╢ ║+26│FistC │Word │Номер 1-го кластера.║ ╟───┼───────┼─────┼────────────────────╢ ║+28│Size │4 │Разм. файла в байтах║ ║ │ │ │ ║ ╚═══╧═══════╧═════╧════════════════════╝ Следующая таблица отражает значение по- ля Fattr. ╔════╤════════════════════════╗ ║бит │ Смысл ║ ╟────┼────────────────────────╢ ║ 0 │ Защита от изменений. ║ ║ 1 │ Скрытый файл. ║ ║ 2 │ Системный файл. ║ ║ 3 │ Идентификатор тома ??? ║ ║ 4 │ Подкаталог ║ ║ 5 │ Признак архивации ║ ║ │ ║ ╚════╧════════════════════════╝ Поле FirstC содержит номер первого кластера файла или каталога. Подкаталоги имеют ту же структуру что и корневой ка- талог. Байт #00 в начале описателя файла указывает на конец каталога, а #120 на то что этот файл стерт. Для каждого под- каталога элемент с именем "." содержит ссылку в корневой каталог, а ".." - на предыдущий уровень. 1.5 Заключение. Вот пожалуй и все что необходимо знать синклеристу о системе MSDOS. Еще не могу не сказать о пришедшей ко мне недавно в голову идее, относительно ускоения опе- раций с MSDOS диском. Очень часто клас- тера файла лежат друг за другом и поэто- му, чтобы не читать кластеры по одному (а это и есть главный тормоз), можно посмотреть FAT таблицу, вычленить группы смежно лежащих кластеров и считывать эти группы как пачки секторов. По моей при- кидке скорость должна возрости в 3-4 ра- за, так как диск не будет делать левые обороты там где не надо. Вобщем, я думаю, информации достаточно чтобы написать грамотный конвертер. Если необходима дополнительная информация или какие либо исходники обращайтесь ко мне (KotSoft'у). Засим расшаркаюсь... При написании статьи использовались справочные материалы из книги В.В. Фара- онова. "Turbo Pascal 7.0 - Практикум программирования" (C) KotSoft 31.08.00
Other articles:
|
|
|
|
|
|
|
|
Similar articles:
В этот день... 21 November