Когда в 1994 году на рынке появились первые жесткие диски с поддержкой LBA-адресации, а год спустя стандарт EIDE с 28-битным LBA стал повсеместным, это ознаменовало собой конец эпохи непосредственного, почти тактильного взаимодействия программиста с физической геометрией диска. До этого момента, в мире MS-DOS и IBM PC, каждый байт информации на диске был не просто абстрактным «блоком», а конкретной точкой в трехмерном пространстве цилиндров, головок и секторов. Это было время, когда системный программист должен был быть не только логиком, но и своего рода «археологом» аппаратного обеспечения, понимающим, как кремний и магнетизм взаимодействуют на низшем уровне.
Введение: Исторический контекст и актуальность низкоуровневого программирования дисков
Эпоха IBM PC и операционной системы MS-DOS, зародившаяся в начале 1980-х годов, стала краеугольным камнем современной вычислительной техники. Эти системы не просто проложили путь к массовому распространению персональных компьютеров, но и сформировали архитектурные и программные парадигмы, отголоски которых мы находим даже в самых современных системах.
Понимание механизмов низкоуровневого программирования дисков в контексте MS-DOS не является лишь академическим упражнением в истории вычислительной техники. Это фундаментальный элемент для любого системного программиста, позволяющий глубоко осознать принципы работы операционных систем, файловых систем и аппаратных интерфейсов. Знание того, как данные физически записываются, адресуются и извлекаются, дает ключ к оптимизации производительности, отладке сложных системных ошибок и даже проектированию новых архитектур. Актуальность такого анализа сохраняется и сегодня, поскольку многие концепции, заложенные в MS-DOS, стали основой для последующих поколений ОС, а сам процесс загрузки компьютера и базовые принципы взаимодействия с дисками уходят корнями именно в ту эпоху.
Настоящая курсовая работа ставит своей целью не просто описать, а глубоко проанализировать низкоуровневые механизмы работы с дисками в среде MS-DOS и архитектуре IBM PC. Мы пройдем путь от физического строения дисковых накопителей до тонкостей файловой системы FAT, изучим интерфейсы BIOS и MS-DOS для доступа к данным, а также рассмотрим процесс загрузки операционной системы. Каждый раздел будет посвящен детальному рассмотрению ключевых аспектов, снабженных техническими спецификациями, структурными схемами и алгоритмами, необходимыми для полного и всестороннего понимания предмета.
Архитектура дисковых накопителей в IBM PC и методы адресации
В самом сердце любой компьютерной системы, отвечающей за постоянное хранение данных, находится дисковый накопитель. В эпоху IBM PC, когда MS-DOS была основной операционной системой, эти устройства представляли собой сложные электромеханические системы, чьи особенности напрямую влияли на методы взаимодействия с ними. Понимание их архитектуры и эволюции методов адресации критически важно для постижения низкоуровневого программирования.
Физическая организация жестких и гибких дисков
Представьте себе жесткий диск не просто как «черный ящик» для хранения информации, а как миниатюрный, высокоточный механизм. Его ядро — это гермозона, изолированная от внешней среды, чтобы предотвратить попадание пыли, которая могла бы привести к катастрофическим последствиям для чувствительных магнитных поверхностей. Внутри гермозоны находятся ключевые компоненты:
- Магнитные диски (пластины): Несколько круглых, идеально отполированных пластин, покрытых ферромагнитным слоем, на которых непосредственно хранится информация. Они вращаются на высокой скорости (например, 3600 об/мин для ранних HDD).
- Блок головок с устройством позиционирования: Для каждой магнитной поверхности (верхней и нижней стороны пластины) предусмотрена своя магнитная головка. Эти головки не касаются поверхности диска, а «парят» над ней на микронном расстоянии, читая или записывая данные. Устройство позиционирования (актуатор) отвечает за точное перемещение головок по радиусу пластин.
- Электропривод шпинделя: Мотор, который обеспечивает непрерывное вращение пластин с заданной скоростью.
Помимо гермозоны, существует блок электроники, расположенный снаружи корпуса. Он включает в себя контроллер диска, кэш-память и интерфейсы для связи с компьютером. Именно этот блок преобразует высокоуровневые команды компьютера в низкоуровневые электрические сигналы для управления механикой диска.
Физическая адресация данных на диске традиционно основывалась на трехмерной системе координат:
- Цилиндр (C): Совокупность дорожек одинакового радиуса на всех магнитных поверхностях всех пластин одного накопителя. Цилиндры нумеруются от 0.
- Головка (H): Выбирает конкретную магнитную поверхность пластины, на которой будет производиться чтение или запись. Головки также нумеруются от 0.
- Сектор (S): Минимальная адресуемая единица данных на диске, представляющая собой диапазон градуса поворота диска. Секторы, в отличие от цилиндров и головок, нумеруются от 1.
Таким образом, первый сектор диска имеет адрес (0, 0, 1). Эта схема, известная как CHS (Cylinder, Head, Sector), была основой для прямого доступа к данным на ранних накопителях.
Адресация CHS (Cylinder, Head, Sector)
Принцип CHS-адресации заключался в прямом отображении логических координат на физическую геометрию диска. Для ранних жестких дисков и гибких дискет это было достаточно эффективно: BIOS и операционная система могли «точно знать», где находится каждый сектор. Однако с ростом объемов накопителей CHS-адресация столкнулась с рядом фундаментальных ограничений.
Ограничения CHS-адресации:
На уровне BIOS (прерывание INT 13h) и файловых систем MS-DOS использовались регистры процессора для передачи CHS-координат. Эти регистры имели ограниченную разрядность:
- Цилиндр (C): 10 бит (от 0 до 1023)
- Головка (H): 8 бит (от 0 до 255)
- Сектор (S): 6 бит (от 1 до 63)
С учетом того, что размер сектора обычно составлял 512 байт, максимальный адресуемый объем диска в классическом CHS-режиме составлял:
1024 цилиндра × 256 головок × 63 сектора/дорожку × 512 байт/сектор ≈ 8 455 716 864 байт, или примерно 7.844 ГБ.
Это ограничение стало известно как «барьер 8 ГБ». Ещё раньше существовал «барьер 504 МБ», связанный с различными интерпретациями максимального количества головок и секторов на дорожке (например, 1024 цилиндра × 16 головок × 63 сектора/дорожку × 512 байт/сектор ≈ 528 482 304 байт).
«Логичность» CHS для дисков более 524 МБ:
Когда объемы жестких дисков стали превышать эти барьеры, производители столкнулись с проблемой совместимости: старые BIOS не могли адресовать новые диски напрямую. В ответ на это возникли «хаки» и «трюки» BIOS-трансляций, которые создавали логическую геометрию, отличающуюся от физической.
- Метод «Large» (или «Extended CHS»): BIOS сообщал операционной системе вдвое большее число головок и вдвое меньшее число цилиндров, эффективно «обманывая» ОС и позволяя ей использовать больший объем диска, сохраняя при этом видимость CHS-адресации. Это был своего рода программный мост через аппаратные ограничения.
- Позднее контроллеры стали сообщать BIOS максимально допустимые значения: 63 сектора на дорожке и 255 головок. Число цилиндров подбиралось так, чтобы общий объем соответствовал реальному размеру диска. В этом случае CHS-координаты уже совершенно не соответствовали физическому положению сектора на диске. Диск сам выполнял внутреннее преобразование логического CHS-адреса в свой собственный, внутренний физический адрес.
Адресация LBA (Logical Block Address)
Появление LBA-адресации стало революционным шагом в развитии дисковых технологий, полностью изменив подход к взаимодействию с накопителями.
Переход к LBA:
Внедрение LBA началось в 1994 году и стало доминирующей формой адресации после 1996 года, особенно с развитием стандарта EIDE (Extended IDE) и появлением 28-битного LBA в спецификации ATA-1. Причиной такого перехода стала не только необходимость преодолеть ограничения CHS, но и усложнение физической архитектуры жестких дисков. Современные накопители используют Zone Bit Recording (ZBR) — запись с переменной плотностью, где количество секторов на дорожке меняется в зависимости от ее радиуса (дорожки на внешнем радиусе имеют больше секторов). В такой архитектуре фиксированная CHS-геометрия, сообщаемая диском, перестала соответствовать истинной физической геометрии.
Принцип линейной адресации секторов:
LBA (Logical Block Address) — это схема адресации, которая воспринимает весь накопитель как единый, непрерывный массив блоков (секторов), каждый из которых имеет уникальный номер, начиная с 0. Это значительно упростило программирование, поскольку отпала необходимость в сложных расчетах цилиндров, головок и секторов.
Формулы преобразования LBA в CHS:
Несмотря на доминирование LBA, для совместимости с устаревшими BIOS и операционными системами (особенно для загрузочных целей) часто требовалось обратное преобразование LBA в CHS. BIOS мог переключаться в режим LBA с помощью расширений INT 13h, но иногда приходилось выполнять преобразование вручную.
Пусть секторов_на_дорожке — это количество секторов на одной дорожке (логическое, обычно 63), а числа_головок — количество головок (логическое, обычно 255 или 16). Тогда преобразование LBA-адреса в CHS-координаты выглядит так:
Сектор = (LBA % секторов_на_дорожке) + 1
Головка = (LBA / секторов_на_дорожке) % числа_головок
Цилиндр = (LBA / секторов_на_дорожке) / числа_головок
Совместимость и необходимость CHS-адресации для загрузки:
Даже после повсеместного внедрения LBA, поддержка CHS-адресации оставалась критически важной, по крайней мере, для начальной загрузки системы. BIOS, особенно старые версии, при загрузке оперировал именно CHS-координатами. Конвертация LBA в CHS была необходима для дисковых накопителей от 528 МБ до 8 ГБ. Для дисков меньше 528 МБ CHS-адресация не требовала преобразования, а свыше 8 ГБ CHS-адресация перестала поддерживаться жесткими дисками ATA или системным программным обеспечением BIOS. Таким образом, граница в 8 ГБ стала символом перехода от чисто CHS-мира к LBA-доминированию, хотя и с оговорками на обратную совместимость.
Низкоуровневый доступ к дискам через BIOS (INT 13h)
В архитектуре IBM PC BIOS (Basic Input/Output System) выступает в роли первичного связующего звена между операционной системой и аппаратным обеспечением. Для работы с дисковыми накопителями критически важным является программное прерывание INT 13h, предоставляющее стандартизированный низкоуровневый интерфейс к адаптерам гибких и жестких дисков. Этот интерфейс учитывает специфику аппаратуры и позволяет выполнять базовые операции ввода-вывода.
Базовые функции INT 13h и их параметры
Механизм вызова функций INT 13h основывается на использовании регистров процессора архитектуры x86. Для вызова конкретной функции системная программа должна выполнить следующие действия:
- Загрузить код функции в регистр AH. Каждый код функции (например,
00hдля сброса,02hдля чтения сектора) соответствует определенной операции. - Загрузить необходимые параметры в другие регистры. Это могут быть номера дисков, цилиндров, головок, адреса буферов памяти для данных и т.д.
- Вызвать прерывание INT 13h.
Рассмотрим некоторые из основных функций INT 13h:
- AH = 00h: Сброс дисковой системы. Эта функция сбрасывает контроллер диска, сбрасывая все внутренние ошибки и готовя его к новым операциям.
- Вход: DL = номер диска (0-3 для гибких, 80h-81h для жестких).
- Выход: Флаг переноса очищен при успехе, установлен при ошибке; AH = код ошибки.
- AH = 01h: Определение состояния диска. Возвращает последний код состояния дисковой операции.
- Вход: DL = номер диска.
- Выход: AH = код состояния.
- AH = 02h: Чтение сектора. Одна из наиболее часто используемых функций, позволяющая считать один или несколько секторов с диска.
- Вход:
DL= номер диска (0-3 для дискет, 80h/81h для HDD 0/1).DH= номер головки (0-255).CH= номер дорожки (цилиндра) (младшие 8 бит, 0-1023).CL= номер сектора (1-63) и старшие 2 бита номера цилиндра (биты 6 и 7).AL= число секторов для чтения (1-128).ES:BX= указатель на буфер памяти, куда будут записаны прочитанные данные.
- Выход: Флаг переноса очищен при успехе, установлен при ошибке; AH = код ошибки; AL = число прочитанных секторов (при успехе совпадает с входным AL).
- Пример параметров для CL: бит 0-5 — номер сектора (1-63), бит 6-7 — старшие биты цилиндра (итого 10 бит для цилиндра).
- Вход:
- AH = 03h: Запись сектора. Аналогична функции чтения, но записывает данные из буфера на диск.
- Вход: Те же параметры, что и для AH=02h.
- Выход: Флаг переноса очищен при успехе, установлен при ошибке; AH = код ошибки; AL = число записанных секторов.
- AH = 05h: Форматирование дорожки. Используется для низкоуровневого форматирования одной дорожки диска.
- Вход: DL = номер диска, DH = номер головки, CH = номер дорожки, ES:BX = указатель на таблицу параметров форматирования.
- Выход: Флаг переноса и AH как обычно.
- AH = 08h: Получение параметров диска. Эта функция предоставляет информацию о геометрии диска, которую BIOS «видит».
- Вход: DL = номер диска.
- Выход:
- Флаг переноса очищен при успехе, установлен при ошибке.
- AH = 00h при успехе (или код ошибки).
- DL = число жестких дисков, присоединенных к системе (если входной DL — жесткий диск).
- DH = максимальный номер головки (например, 15 для 16 головок).
- CH = максимальный номер цилиндра (младшие 8 бит).
- CL = максимальный номер сектора (биты 0-5) и старшие 2 бита максимального номера цилиндра (биты 6-7).
- ES:DI = указатель на таблицу параметров диска (для HDD).
При возникновении ошибки во время операции, флаг переноса в регистре флагов процессора устанавливается в 1, а в регистре AH возвращается код ошибки, указывающий на причину сбоя (например, 01h — неверный параметр, 04h — сектор не найден, 80h — диск не готов). Это позволяет программе адекватно реагировать на проблемы с дисковыми операциями.
Расширения INT 13h (BIOS Enhanced Disk Drive Services, EDD)
С увеличением объемов жестких дисков классический интерфейс INT 13h с его CHS-адресацией столкнулся с непреодолимым барьером. Максимальное количество секторов, поддерживаемых этим интерфейсом, составляло до 1024 × 256 × 63 = 16 515 072, что при 512 байтах на сектор давало максимальный размер около 8 ГБ. Для преодоления этого ограничения были введены расширения INT 13h, известные как BIOS Enhanced Disk Drive Services (EDD).
Эти расширения, впервые появившиеся в конце 1990-х годов, предложили новый, более гибкий механизм работы с дисками, снимая практические ограничения на их размер для операционных систем, осведомленных об этом интерфейсе (например, DOS 7.0 в Windows 95).
Ключевые особенности EDD:
- Поддержка LBA-адресации: Расширенные функции INT 13h, такие как AH=42h для чтения секторов, использовали не CHS, а LBA-адресацию. Это позволило работать с дисками как с единым линейным массивом секторов, значительно упростив адресацию больших накопителей.
- Пакетная структура запросов: Вместо отдельных параметров в регистрах, расширенные функции используют так называемые пакеты дисковых адресов (Disk Address Packet, DAP) — структуры данных в памяти, содержащие все необходимые параметры для операции (число секторов, 64-битный LBA-адрес начального сектора, адрес буфера данных и т.д.).
- AH = 42h: Расширенное чтение секторов.
- Вход: DL = номер диска, DS:SI = указатель на DAP.
- Выход: Флаг переноса и AH как обычно.
- AH = 42h: Расширенное чтение секторов.
Использование 64-битной LBA-адресации в этих расширениях позволило адресовать диски объемом до 8 зеттабайт, что на тот момент казалось практически безграничным. Таким образом, EDD стали мостом между устаревшей CHS-парадигмой и современными методами адресации, обеспечив необходимую совместимость и масштабируемость для дальнейшего развития компьютерных систем.
Программирование контроллеров гибких и жестких дисков
Низкоуровневая работа с дисками не ограничивается только вызовами функций BIOS. На более глубоком уровне программист мог взаимодействовать непосредственно с аппаратными контроллерами дисков через порты ввода/вывода, что давало максимальный контроль, но требовало глубокого понимания архитектуры железа.
Типы контроллеров дисков в IBM PC/XT/AT
В ранних IBM PC/XT для подключения жестких дисков широко использовались контроллеры MFM (Modified Frequency Modulation) и RLL (Run Length Limited). Эти контроллеры были ответственны за кодирование и декодирование данных, передаваемых между процессором и магнитными поверхностями дисков. Они требовали очень точной настройки под конкретный тип диска (количество цилиндров, головок, скорость вращения), что часто осуществлялось через перемычки или BIOS-настройки.
Архитектура IBM PC AT и последующих машин включала в себя более совершенные контроллеры. В BIOS IBM PC AT, например, был встроен драйвер для «стандартного» 16-битного MFM-контроллера жестких дисков Western Digital на чипсете WD1010. Это означало, что BIOS уже содержал код для инициализации и базового взаимодействия с этим популярным контроллером, упрощая интеграцию жестких дисков. Позднее появились стандарты IDE/ATA, где контроллер был интегрирован непосредственно в сам диск, что значительно упростило подключение и программирование, но на самых ранних этапах контроллер был отдельной платой расширения.
Контроллер прямого доступа к памяти (DMA)
Для повышения эффективности обмена данными между дисками и оперативной памятью, не загружая при этом центральный процессор, в архитектуре IBM PC использовался контроллер прямого доступа к памяти (DMA). В IBM PC/XT он был реализован на базе микросхемы Intel 8237A, которая содержала четыре независимых канала.
Архитектура и функциональность Intel 8237A:
- Четыре канала: Каждый канал DMA мог быть настроен для работы с определенным периферийным устройством.
- Прямая передача данных: DMA позволял выполнять операции передачи данных непосредственно между оперативной памятью и устройствами ввода/вывода (такими как контроллеры накопителей на гибких магнитных дисках (НГМД) и накопителей на магнитных дисках (НМД)), минуя процессор. Это значительно увеличивало скорость обмена данными, поскольку процессор освобождался для выполнения других задач, пока DMA-контроллер управлял передачей.
Использование каналов DMA:
- Канал 2 контроллера DMA традиционно использовался адаптером НГМД.
- Канал 3 был зарезервирован для адаптера НМД, причем канал НМД обычно имел низший приоритет по сравнению с НГМД.
Механизм работы DMA:
Процесс работы с DMA начинался с того, что процессор программировал DMA-контроллер, указывая:
- Адрес начала буфера в оперативной памяти.
- Количество байтов для передачи.
- Направление передачи (чтение или запись).
- Номер канала DMA.
После этого процессор инициировал операцию на контроллере диска, который, в свою очередь, запрашивал у DMA-контроллера передачу данных. DMA-контроллер временно «захватывал» шину памяти, выполняя передачу данных между диском и ОЗУ, после чего освобождал шину и сигнализировал процессору о завершении операции. Этот механизм был критически важен для производительности систем того времени, позволяя избежать «узких мест», связанных с процессором, и обеспечивая эффективный параллельный доступ к данным. Осознание этого принципа помогает понять, почему современные системы используют похожие подходы для высокоскоростного обмена данными.
Структура файловой системы FAT в MS-DOS
Файловая система FAT (File Allocation Table) — это не просто набор правил для хранения файлов, это фундаментальная архитектура, которая десятилетиями определяла, как MS-DOS, а затем и первые версии Windows, управляли дисковым пространством. Ее простота и эффективность стали залогом широкого распространения в эпоху IBM PC.
Версии FAT и их характеристики
История FAT начинается с FAT12, разработанной для гибких дискет, и эволюционирует в FAT16 для жестких дисков. Основное различие между ними заключается в разрядности записей в таблице FAT, то есть в количестве бит, отводимых для хранения номера кластера.
- FAT12: Использовала 12-битные записи для кластеров, что позволяло адресовать до 212 = 4096 кластеров. С учетом максимального размера кластера в 32 КБ (для дискет это было редко, чаще 512 байт или 1 КБ), максимальный размер тома составлял 128 МБ.
- FAT16: Применялась для дисков объемом до 4 ГБ. Изначально, в MS-DOS 3.0 (1984 год), FAT16 поддерживала максимальный размер раздела 32 МБ. Позднее, с расширением блока параметров BIOS (BPB), максимальный объем раздела FAT16 достиг 4 ГБ за счет использования 65 536 (216) кластеров и максимального размера кластера в 64 КБ (например, 64 сектора по 512 байт). Однако для обеспечения совместимости с MS-DOS, Windows 95 и Windows 98 объем тома FAT16 обычно не должен был превышать 2 ГБ, поскольку некоторые старые утилиты и BIOS могли некорректно работать с бóльшими разделами из-за 16-битных ограничений.
Логический раздел, отформатированный под FAT, имеет четко определенную структуру, состоящую из нескольких ключевых областей: загрузочный сектор, одна или несколько копий таблицы FAT, корневой каталог (в FAT12/FAT16) и область данных.
Компоненты логического раздела FAT
Каждый элемент файловой системы FAT выполняет свою уникальную функцию, обеспечивая упорядоченное хранение и доступ к данным.
Главная Загрузочная Запись (MBR)
MBR — это сердце загрузочного процесса на жестком диске. Она расположена в первом физическом секторе жесткого диска (LBA 0). Это не просто данные, это комбинация исполняемого кода и структур данных, необходимых для начальной загрузки операционной системы.
- Содержимое: MBR включает в себя небольшой фрагмент исполняемого кода (загрузчика), таблицу разделов диска (Partition Table) и специальную сигнатуру (0x55AA), которая указывает на корректность MBR.
- Функция: BIOS загружает код MBR в оперативную память (обычно по адресу
0000:7c00) и передает ему управление. Главная задача MBR — передать управление загрузочному коду активного раздела диска, который указан в таблице разделов. MBR не знает, где находится ОС, она лишь указывает путь к VBR активного раздела.
Загрузочный Сектор Тома (Boot Record / VBR)
Самый первый сектор логического диска (или системной дискеты) занимает Загрузочная Запись Тома (VBR). Именно этот сектор считывается из активного раздела диска программой главной загрузочной записи (MBR) и запускается на выполнение.
- Назначение: Основная задача VBR — выполнить загрузку операционной системы, то есть найти и загрузить системные файлы ОС.
- Блок Параметров BIOS (BPB): Кроме программы начальной загрузки ОС, в загрузочной записи находятся параметры, описывающие характеристики логического диска. Эта структура данных, известная как Блок Параметров BIOS (BPB), содержит критически важную информацию, такую как:
- Размер сектора.
- Количество секторов в кластере.
- Количество зарезервированных секторов.
- Количество копий таблицы FAT.
- Размер корневого каталога (для FAT12/FAT16).
- Общее количество секторов на томе.
- Тип файловой системы (FAT12/FAT16).
В MS-DOS 2.x BPB был введен как обязательная структура загрузочного сектора, по которой следовало определять формат тома.
Таблица Размещения Файлов (FAT)
FAT — это, по сути, «карта» дискового пространства. Она представляет собой массив индексных указателей, или «ячеек», каждая из которых соответствует определенному кластеру области данных.
- Надежность: Для повышения надежности и защиты от повреждений на диске обычно представлено две идентичные копии таблицы FAT. Если одна копия повреждается, система может использовать вторую.
- Цепочки кластеров: Если кластер принадлежит файлу, соответствующая ему ячейка в таблице FAT содержит номер следующего кластера этого же файла. Таким образом, файл хранится в виде цепочки кластеров.
- Маркеры FAT:
- 0: Неиспользуемым (свободным) кластерам в таблице FAT соответствуют нули.
- 0xFFFF (для FAT16) / 0xFFF (для FAT12): Если ячейка соответствует последнему кластеру файла, то она содержит специальное значение, указывающее на конец цепочки.
- 0xFFF7 (для FAT16) / 0xFF7 (для FAT12): «Плохим» кластерам (которые повреждены и исключаются из обработки) соответствует специальный код.
Корневой Каталог (Root Directory)
В файловых системах FAT12 и FAT16 специально выделяется область корневого каталога. Она имеет фиксированное положение (сразу после таблиц FAT) и фиксированный размер (например, 512 записей по 32 байта каждая).
- Содержимое: Каждая запись в корневом каталоге (и в подкаталогах) содержит информацию о файле или подкаталоге: имя (8.3 формат), расширение, атрибуты (только для чтения, скрытый, системный, каталог, том), дату и время создания/изменения, размер файла и самое главное — номер первого кластера файла в области данных.
Область Данных и Кластеры
Область данных — это самое большое пространство на диске, где непосредственно хранится содержимое файлов и подкаталогов. Оно разбито на кластеры.
- Кластер: Является минимальной единицей дискового пространства, выделяемой файловой системой. Размер кластера может варьироваться от 1 до 64 секторов (512 байт/сектор). Выбор размера кластера влияет на эффективность использования дискового пространства: маленькие кластеры уменьшают фрагментацию, но увеличивают размер таблицы FAT; большие кластеры сокращают FAT, но приводят к «потерянному» пространству (slack space) для мелких файлов.
Структура FAT, несмотря на свою относительную простоту, стала основой для понимания того, как операционные системы управляют данными на дисках, и заложила фундамент для более сложных файловых систем.
Доступ к дискам и файлам через прерывания MS-DOS
Помимо низкоуровневого доступа через BIOS (INT 13h), операционная система MS-DOS предоставляла свой собственный набор программных прерываний для работы с дисками и файлами. Эти прерывания, в частности INT 25h и INT 26h, предлагали более высокоуровневый, но все еще прямой доступ к секторам диска, абстрагируясь от некоторых аппаратных деталей.
INT 25h (Абсолютное чтение) и INT 26h (Абсолютная запись)
Прерывания MS-DOS INT 25h и INT 26h предоставляли функциональность абсолютного чтения и записи секторов с логического диска. Это означало, что они работали с разделами, уже размеченными и отформатированными под файловую систему MS-DOS, а не напрямую с физическими жесткими дисками, как это делал INT 13h BIOS.
Назначение:
- INT 25h (Absolute Disk Read): Используется для чтения одного или нескольких секторов с указанного логического диска.
- INT 26h (Absolute Disk Write): Используется для записи одного или нескольких секторов на указанный логический диск.
Отличия от INT 13h BIOS:
Эти службы DOS сопоставимы со службами, предоставляемыми BIOS через INT 13h, но имеют два ключевых отличия:
- Нумерация секторов:
- DOS нумерует секторы диска последовательно, начиная с 0 для первого сектора первого цилиндра, первой головки (то есть, это линейная, логическая нумерация).
- BIOS (INT 13h) идентифицирует секторы по трем отдельным координатам: цилиндр (C), головка (H) и сектор (S).
Формула для преобразования CHS-нумерованных секторов в формат DOS:
Для того чтобы перейти от CHS-адресации к линейной нумерации DOS, можно использовать следующую формулу:
DOS.Номер.Сектора = (BIOS.Сектор - 1) + BIOS.Головка × СекторовНаДорожке + BIOS.Цилиндр × СекторовНаДорожке × ГоловокНаДискегде
СекторовНаДорожке— это количество секторов на одной дорожке, аГоловокНаДиске— количество головок на диске (эти значения берутся из параметров диска, возвращаемых BIOS). - Рабочая область:
- DOS работает с логическими дисками (например, C:, D:), которые являются разделами физических дисков. Она учитывает границы разделов и их внутреннюю структуру.
- BIOS (INT 13h) работает только с физическими дисками (например, первый HDD, второй HDD) и не знает о логических разделах, файловых системах или границах томов.
Эти различия делали прерывания MS-DOS более удобными для программистов, работающих на уровне файловых систем или утилит, которым нужно было читать/писать данные, не заботясь о том, на каком физическом диске расположен логический том.
Параметры и эволюция вызовов
Вызовы INT 25h/26h также использовали регистры процессора для передачи параметров:
- Исходные параметры (до DOS 4.0):
AL= номер диска (0=A:, 1=B:, 2=C:, и так далее).CX= количество секторов для чтения/записи (максимум 65535, 16-битное значение).DS:BX= указатель на буфер памяти для передачи данных.DX= начальный номер сектора (логический, 16-битное значение, 0-65535).
- Поддержка больших дисков (DOS 4.0+):
С увеличением объемов дисков 16-битные регистры
CXиDXстали ограничивающим фактором (максимум 65535 секторов по 512 байт = 32 МБ). В DOS 4.0 и выше был добавлен механизм для доступа к номерам секторов, превышающим 65535. Для этого:AL= номер диска.CXустанавливался вFFFFh(специальный маркер).DS:BXуказывал на адрес структурыAbsDiskIORec(Extended Disk Access Packet). Эта структура в памяти содержала 32-битные поля для начального номера сектора и количества секторов, позволяя работать с дисками гораздо большего объема.
Важность извлечения данных из стека:
Одной из особенностей вызовов INT 25h/26h является то, что они оставляют одно слово данных в стеке после своего выполнения (обычно это флаги или адрес возврата, который DOS использует для своих внутренних целей). Программист обязан извлечь это слово из стека (например, с помощью инструкции POP AX или ADD SP, 2) после возврата из прерывания, чтобы стек оставался корректным и не приводил к сбоям программы.
Прерывания MS-DOS для абсолютного доступа к дискам были важным промежуточным слоем между аппаратными возможностями BIOS и высокоуровневыми файловыми операциями. Они позволяли системным программистам создавать утилиты для работы с дисками, минуя файловую систему, но с учетом логической организации томов, что было удобно для таких задач, как восстановление данных или низкоуровневое форматирование.
Процесс загрузки операционной системы MS-DOS
Загрузка операционной системы — это сложный многоступенчатый процесс, который начинается задолго до того, как пользователь видит командную строку DOS. В архитектуре IBM PC и MS-DOS этот процесс является ярким примером взаимодействия аппаратного обеспечения, BIOS и системного программного обеспечения.
Начальная проверка оборудования (POST) и поиск загрузочного диска
Все начинается в момент включения компьютера. Центральный процессор (x86-совместимый) начинает выполнение кода, расположенного по фиксированному адресу, который указывает на BIOS (Basic Input/Output System), записанную в постоянной памяти (ПЗУ).
- Процедура POST (Power-On Self Test): BIOS первой выполняет процедуру самотестирования. Она проверяет работоспособность основных аппаратных компонентов: процессор, оперативную память, видеоадаптер, клавиатуру, контроллеры дисков и другие устройства. Если POST обнаруживает критические ошибки, он сообщает о них пользователю звуковыми сигналами или кодами ошибок на экране.
- Поиск загрузочного диска: После успешного завершения POST BIOS переходит к поиску загрузочного устройства. В стандартной конфигурации IBM PC порядок поиска был следующим: сначала дисковод A: (гибкая дискета), затем первый жесткий диск.
- Если в дисководе A: не установлена дискета или она не является загрузочной, BIOS обращается к жесткому диску.
- BIOS считывает Главную Загрузочную Запись (MBR) — первый физический сектор жесткого диска (LBA 0) — в оперативную память. Обычно, это происходит по адресу
0000:7c00h. - После загрузки MBR, BIOS передает управление загрузочному коду, содержащемуся в MBR, путем перехода по адресу
0000:7c00h.
Передача управления и загрузка системных файлов
С этого момента контроль переходит от BIOS к коду MBR.
- Загрузочный код MBR: Программа MBR анализирует таблицу разделов диска, которая также находится внутри MBR. Ее задача — найти активный (загрузочный) раздел. Как только активный раздел найден, MBR считывает самый первый сектор этого раздела, который является Загрузочной Записью Тома (Boot Record / VBR), и загружает его в память (обычно также по адресу
0000:7c00h), после чего передает управление коду VBR. - Программа VBR: Задача VBR — уже непосредственно найти и загрузить системные файлы операционной системы. Для MS-DOS это были два скрытых системных файла: IO.SYS и MSDOS.SYS (или их аналоги IBMBIO.COM и IBMDOS.COM для IBM DOS). VBR читает эти файлы посекторно, опираясь на информацию из BPB и FAT, и загружает их в оперативную память.
Инициализация ядра DOS
Загруженные системные файлы начинают процесс инициализации операционной системы.
- Файл IO.SYS: Этот файл обычно состоит из двух основных модулей:
- BIOS (Basic I/O System): Это набор резидентных драйверов устройств, которые дополняют функции BIOS компьютера, предоставляя стандартизированный интерфейс для работы с устройствами для MS-DOS. Он инициализирует базовые устройства, такие как клавиатура, экран, диски и последовательные порты.
- SYSINIT (System Initializer): Программа инициализации, которая выполняет ряд критически важных задач.
- Функции SYSINIT:
- Определяет объем доступной оперативной памяти.
- Переносит ядро DOS (MSDOS.SYS) из временной области загрузки в его окончательное резидентное расположение в памяти.
- Затем вызывает программу инициализации, содержащуюся в модуле MSDOS.SYS.
- Инициализация ядра DOS (MSDOS.SYS):
- Ядро DOS инициализирует свои внутренние таблицы и структуры данных.
- Устанавливает векторы прерываний (с
20hпо2Fh), которые являются основными точками входа для программ, желающих использовать службы операционной системы. - Перебирает список резидентных драйверов устройств, зарегистрированных в IO.SYS, и инициализирует их.
- Затем DOS ищет файл CONFIG.SYS в корневом каталоге загрузочного диска. Если он найден, DOS обрабатывает его, загружая дополнительные драйверы устройств (
DEVICE=) и настраивая системные параметры (BUFFERS=,FILES=,SHELL=). - После этого DOS загружает COMMAND.COM (или другой командный интерпретатор, указанный в
SHELL=) в память. COMMAND.COM является основным пользовательским интерфейсом DOS. - Наконец, COMMAND.COM ищет и выполняет файл AUTOEXEC.BAT, если он присутствует. Этот файл содержит команды, которые должны быть выполнены автоматически при каждой загрузке системы, настраивая переменные среды, запуска необходимые программы и т.д.
После выполнения AUTOEXEC.BAT пользователь получает приглашение командной строки (например, C:\>), что означает, что операционная система MS-DOS полностью загружена и готова к работе. Этот сложный, но четко определенный процесс стал основой для всех последующих операционных систем, демонстрируя изящество и прагматизм раннего системного программирования.
Ограничения и эволюция дисковых технологий MS-DOS
Эпоха MS-DOS, несмотря на свое доминирование, была временем постоянной борьбы с аппаратными и программными ограничениями. Каждое новое достижение в области дисковых технологий приводило к появлению новых вызовов, которые требовали изобретательных решений, часто в виде «хаков» и «трюков».
Исторические ограничения файловой системы и адресации
В самом начале своего пути, файловая система FAT была удивительно примитивной. В ранних версиях (до MS-DOS 2.0) она не поддерживала иерархическую систему каталогов. Все файлы располагались в корневом каталоге диска, что делало организацию данных на дисках большого объема крайне неудобной. Только в MS-DOS 2.0 была введена иерархия файлов и папок, что стало значительным шагом вперед.
Однако куда более серьезные ограничения были связаны с CHS-адресацией. Как уже упоминалось, 24-битный адрес (10 бит на цилиндр, 8 на головку, 6 на сектор) позволял адресовать до 7.844 ГБ информации. Это ограничение, а также более ранние барьеры (например, 504 МБ), связанные с различными интерпретациями максимального количества головок (16) и секторов (63), делали этот API устаревшим для быстро растущих объемов дисков.
- Барьер 504 МБ: Стандартный CHS-режим, используемый для дисков размером менее 504 МБ, не выполнял преобразований на уровне BIOS, и логическая геометрия диска (например, 1024 цилиндра, 16 головок, 63 сектора) использовалась BIOS напрямую. Это было жесткое ограничение.
- BIOS-трансляции («large mode»): Для обхода барьера в 504 МБ (а затем и 8 ГБ) были введены «хаки» или «трюки» в BIOS, такие как «large mode» или «extended CHS». Эти методы заключались в том, что BIOS искусственно изменял геометрию, сообщаемую операционной системе (например, удваивал количество головок и уменьшал количество цилиндров), чтобы «обмануть» ОС и заставить ее видеть больший объем диска, чем позволяла классическая CHS-схема. Эти трансляции были по сути программными адаптерами, скрывающими физическую реальность от программного обеспечения.
Влияние технологического прогресса
Технологический прогресс в производстве жестких дисков постоянно опережал возможности программного обеспечения, создавая новые проблемы и требуя новых решений.
- Zone Bit Recording (ZBR): Современные жесткие диски используют ZBR — запись с переменной плотностью. Это означает, что дорожки на внешних радиусах диска содержат больше секторов, чем дорожки на внутренних радиусах, что повышает общую плотность записи. В результате, CHS-геометрия, сообщаемая диском или BIOS, становится мало соответствующей истинной физической геометрии. Это окончательно подорвало концепцию «прямого» CHS-адресации и сделало LBA-адресацию единственным прагматичным решением.
- Роль расширений INT 13h: Именно в ответ на эти вызовы были разработаны расширения INT 13h (BIOS Enhanced Disk Drive Services). Они предоставили стандартизированный интерфейс для работы с LBA-адресацией и сняли практические ограничения на размер диска для операционных систем, поддерживающих новый интерфейс. Это позволило MS-DOS и последующим ОС работать с дисками объемом, значительно превышающим старые 8-ГБ барьеры.
Заключение и выводы
Низкоуровневая работа с дисками в среде MS-DOS и архитектуры IBM PC представляет собой уникальный исторический период, когда программист был тесно связан с аппаратным обеспечением. Изучение этих механизмов позволяет не только понять, как функционировали первые персональные компьютеры, но и оценить, как архитектурные решения того времени повлияли на все последующее развитие операционных систем и файловых систем.
Ключевые аспекты и их влияние:
- CHS-адресация: Несмотря на свои ограничения, она заложила основу для понимания физической организации данных. Ее «логические» расширения продемонстрировали важность абстракций и совместимости.
- BIOS INT 13h: Стал универсальным интерфейсом для низкоуровневого доступа, его функции и параметры легли в основу многих системных утилит и загрузчиков. Расширения INT 13h показали, как можно эволюционировать старые API для поддержки новых технологий.
- Контроллеры и DMA: Понимание работы контроллеров MFM/RLL и DMA-контроллера 8237A раскрывает принципы эффективного взаимодействия процессора с периферией и важность аппаратного ускорения для производительности.
- Файловая система FAT: Ее простая, но эффективная структура (MBR, VBR, FAT, корневой каталог, кластеры) стала образцом для последующих файловых систем и до сих пор используется в различных встраиваемых системах и на флеш-накопителях.
- Процесс загрузки: Многоступенчатый процесс загрузки от POST до COMMAND.COM является классическим примером взаимодействия различных программных и аппаратных компонентов, обеспечивающих старт операционной системы.
Влияние архитектурных решений MS-DOS и IBM PC на развитие современных операционных систем и файловых систем неоспоримо. Многие концепции, такие как загрузочные секторы, таблицы разделов, кэширование дисковых операций и использование DMA, трансформировались, но не исчезли. Исторический анализ низкоуровневой работы с дисками дает системному программисту не только глубокое понимание «почему так происходит», но и инструментарий для анализа и оптимизации современных систем, ведь принципы остаются неизменными, меняется лишь уровень абстракции. Это знание является мощным фундаментом для любого, кто стремится не просто использовать компьютер, но и понимать его до самых глубин. Так почему же не углубиться в эти основополагающие концепции, чтобы получить полную картину работы любой вычислительной системы?
Список использованной литературы
- Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 1. Часть 1, 2, 3. Операционная система MS-DOS. М.: ДИАЛОГ-МИФИ, 1991, 1993.
- Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2. Аппаратное обеспечение IBM PC. Часть 1, 2. М.: ДИАЛОГ-МИФИ, 1992.
- Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 19, MS-DOS для программиста. Часть 2. М.: ДИАЛОГ-МИФИ, 1995.
- INT 13H: дисковый ввод-вывод — Функции BIOS. CodeNet. URL: https://www.codenet.ru/progr/bios/int13.php (дата обращения: 07.11.2025).
- Что такое MBR (Master Boot Record)? ООО «Сисадмин». URL: https://www.sysadmin.ru/articles/chto-takoe-mbr-master-boot-record (дата обращения: 07.11.2025).
- Устройство жесткого диска. Лаборатория восстановления данных «Айкэн». URL: https://www.aican.ru/support/hdd-device.html (дата обращения: 07.11.2025).
- Главная загрузочная запись Роль и место mbr в загрузке компьютера (для архитектуры x86). Хабр. URL: https://habr.com/ru/articles/467657/ (дата обращения: 07.11.2025).
- INT 25h (37) Absolute Disk Read. ctyme.com. URL: http://www.ctyme.com/intr/rb-0431.htm (дата обращения: 07.11.2025).
- MFM-контроллер жёстких дисков. ASV museum of digital archaeology. URL: https://museum.asv.ru/controllers/mfm (дата обращения: 07.11.2025).
- Disk access using the BIOS (INT 13h). OSDev Wiki. URL: https://wiki.osdev.org/Disk_access_using_the_BIOS_(INT_13h) (дата обращения: 07.11.2025).
- 2. Логическая структура диска в MS-DOS. Электронная библиотека книг братьев Фроловых. URL: http://www.frolov-lib.ru/books/bsp/v19/ch2_2.html (дата обращения: 07.11.2025).
- INT 13h: Дисковый ввод/вывод. Низкоуровневое программирование. URL: http://lowlevel.ru/bios-int-13h-disk-io/ (дата обращения: 07.11.2025).
- Что такое CHS (цилиндр / головка / сектор)? NIUBI Partition Editor. URL: https://www.idiskh.com/ru/what-is-chs.html (дата обращения: 07.11.2025).
- HDD. Методы адресации CHS и LBA. Учебный центр «АЛГОРИТМ». URL: http://www.algoritm-ekb.ru/articles/hdd_chs_lba.html (дата обращения: 07.11.2025).
- Файловая система FAT (File Allocation Table – таблица размещения файлов). Lab127. URL: https://www.lab127.ru/fat.html (дата обращения: 07.11.2025).
- Методы адресации LBA и CHS. Жесткий диск. URL: https://harddisk-info.ru/article/metody-adresacii-lba-i-chs/ (дата обращения: 07.11.2025).
- Файловая система FAT16. ЭлекТРИЗоника. URL: https://elektrizonika.ru/fat16.html (дата обращения: 07.11.2025).
- CHS and LBA Hard Disk Addresses. Thomas-Krenn-Wiki-en. URL: https://www.thomas-krenn.com/en/wiki/CHS_and_LBA_Hard_Disk_Addresses (дата обращения: 07.11.2025).
- INT 13H: BIOS Disk I/O. Tech Help! URL: http://www.techhelpmanual.com/185-int_13h__bios_disk_i_o.htm (дата обращения: 07.11.2025).
- 1.5. Функции BIOS для работы с дисками. uchebnik.online. URL: https://uchebnik.online/informatika/funktsii-bios-dlya-rabotyi-s-diskami-10654.html (дата обращения: 07.11.2025).
- Файловая система FAT. programmers-site.ru. URL: http://www.programmers-site.ru/files/fs/fat.html (дата обращения: 07.11.2025).
- Работа с большими жесткими дисками Функции INT 13H. Data Recovery software. URL: https://data-recovery-software.net/ru/funktsii-int-13h.html (дата обращения: 07.11.2025).
- INT 25H/26H: Absolute Disk Read/Write. Tech Help! URL: http://www.techhelpmanual.com/565-int_25h_26h__absolute_disk_read_write.htm (дата обращения: 07.11.2025).
- Еще раз о FAT. cyberforum.ru. URL: https://www.cyberforum.ru/old-os/thread257963.html (дата обращения: 07.11.2025).
- Структура DOS. pcf.ru. URL: https://www.pcf.ru/articles.php?id=30 (дата обращения: 07.11.2025).
- 9. КОНТРОЛЛЕР ПРЯМОГО ДОСТУПА К ПАМЯТИ. Электронная библиотека книг братьев Фроловых. URL: http://www.frolov-lib.ru/books/bsp/v02/ch9_1.html (дата обращения: 07.11.2025).
- Fat. Структура тома. Формат записи каталога. Fat12, fat16, fat32. studfile.net. URL: https://studfile.net/preview/7161838/page:2/ (дата обращения: 07.11.2025).
- Logical block addressing. Wikipedia. URL: https://en.wikipedia.org/wiki/Logical_block_addressing (дата обращения: 07.11.2025).
- BIOS Translation Modes. Data Recovery Salon. URL: https://www.datarecovery.com/resource/bios-translation-modes/ (дата обращения: 07.11.2025).
- LBA to CHS Translation Tutorial | TAJ Operating System. ViralPatel.net. URL: http://www.viralpatel.net/taj/tutorial/lba-to-chs-conversion-in-bios.php (дата обращения: 07.11.2025).
- Файловая система FAT, Загрузочная запись. Studbooks.net. URL: https://studbooks.net/1435759/informatika/faylovaya_sistema_zagruzochnaya_zapis (дата обращения: 07.11.2025).
- Начальная загрузка MS DOS. interface.ru. URL: https://www.interface.ru/home.asp?artId=4727 (дата обращения: 07.11.2025).
- Архитектура файловой системы FAT. Журнал СА 2.2004. osp.ru. URL: https://www.osp.ru/articles/2004/02/170068.htm (дата обращения: 07.11.2025).
- Жесткие диски в IBM PC XT и контроллеры MFM/RLL. Sensi wiki. URL: https://sensi.org/wiki/Жесткие_диски_в_IBM_PC_XT_и_контроллеры_MFM/RLL (дата обращения: 07.11.2025).
- СТРУКТУРА DOS | Процесс загрузки DOS. ОПЕРАЦИОННЫЕ СИСТЕМЫ. URL: http://osys.ru/os/dos/page_5.htm (дата обращения: 07.11.2025).
- Функции DOS — INT 25H/26H: Прямая дисковая операция чтения/записи. CodeNet.ru. URL: https://www.codenet.ru/progr/dos/int25.php (дата обращения: 07.11.2025).
- Восстановление данных в разделах FAT. Электронная библиотека книг братьев Фроловых. URL: http://www.frolov-lib.ru/books/bsp/v19/ch3_2.html (дата обращения: 07.11.2025).
- MS-DOS загрузочный сектор исходный код. Stack Overflow на русском. URL: https://ru.stackoverflow.com/questions/1360341/ms-dos-загрузочный-сектор-исходный-код (дата обращения: 07.11.2025).
- Прерывание BIOS. mark5.ru. URL: https://mark5.ru/programmirovanie/preopivanie-bios.html (дата обращения: 07.11.2025).