Глубокое погружение в дисковые механизмы MS-DOS и архитектуру IBM PC: от аппаратуры до файловой системы

Когда в 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. Для вызова конкретной функции системная программа должна выполнить следующие действия:

  1. Загрузить код функции в регистр AH. Каждый код функции (например, 00h для сброса, 02h для чтения сектора) соответствует определенной операции.
  2. Загрузить необходимые параметры в другие регистры. Это могут быть номера дисков, цилиндров, головок, адреса буферов памяти для данных и т.д.
  3. Вызвать прерывание 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 как обычно.

Использование 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-контроллер, указывая:

  1. Адрес начала буфера в оперативной памяти.
  2. Количество байтов для передачи.
  3. Направление передачи (чтение или запись).
  4. Номер канала 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, но имеют два ключевых отличия:

  1. Нумерация секторов:
    • DOS нумерует секторы диска последовательно, начиная с 0 для первого сектора первого цилиндра, первой головки (то есть, это линейная, логическая нумерация).
    • BIOS (INT 13h) идентифицирует секторы по трем отдельным координатам: цилиндр (C), головка (H) и сектор (S).

    Формула для преобразования CHS-нумерованных секторов в формат DOS:

    Для того чтобы перейти от CHS-адресации к линейной нумерации DOS, можно использовать следующую формулу:

    DOS.Номер.Сектора = (BIOS.Сектор - 1) + BIOS.Головка × СекторовНаДорожке + BIOS.Цилиндр × СекторовНаДорожке × ГоловокНаДиске
    

    где СекторовНаДорожке — это количество секторов на одной дорожке, а ГоловокНаДиске — количество головок на диске (эти значения берутся из параметров диска, возвращаемых BIOS).

  2. Рабочая область:
    • 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), записанную в постоянной памяти (ПЗУ).

  1. Процедура POST (Power-On Self Test): BIOS первой выполняет процедуру самотестирования. Она проверяет работоспособность основных аппаратных компонентов: процессор, оперативную память, видеоадаптер, клавиатуру, контроллеры дисков и другие устройства. Если POST обнаруживает критические ошибки, он сообщает о них пользователю звуковыми сигналами или кодами ошибок на экране.
  2. Поиск загрузочного диска: После успешного завершения POST BIOS переходит к поиску загрузочного устройства. В стандартной конфигурации IBM PC порядок поиска был следующим: сначала дисковод A: (гибкая дискета), затем первый жесткий диск.
    • Если в дисководе A: не установлена дискета или она не является загрузочной, BIOS обращается к жесткому диску.
    • BIOS считывает Главную Загрузочную Запись (MBR) — первый физический сектор жесткого диска (LBA 0) — в оперативную память. Обычно, это происходит по адресу 0000:7c00h.
    • После загрузки MBR, BIOS передает управление загрузочному коду, содержащемуся в MBR, путем перехода по адресу 0000:7c00h.

Передача управления и загрузка системных файлов

С этого момента контроль переходит от BIOS к коду MBR.

  1. Загрузочный код MBR: Программа MBR анализирует таблицу разделов диска, которая также находится внутри MBR. Ее задача — найти активный (загрузочный) раздел. Как только активный раздел найден, MBR считывает самый первый сектор этого раздела, который является Загрузочной Записью Тома (Boot Record / VBR), и загружает его в память (обычно также по адресу 0000:7c00h), после чего передает управление коду VBR.
  2. Программа VBR: Задача VBR — уже непосредственно найти и загрузить системные файлы операционной системы. Для MS-DOS это были два скрытых системных файла: IO.SYS и MSDOS.SYS (или их аналоги IBMBIO.COM и IBMDOS.COM для IBM DOS). VBR читает эти файлы посекторно, опираясь на информацию из BPB и FAT, и загружает их в оперативную память.

Инициализация ядра DOS

Загруженные системные файлы начинают процесс инициализации операционной системы.

  1. Файл IO.SYS: Этот файл обычно состоит из двух основных модулей:
    • BIOS (Basic I/O System): Это набор резидентных драйверов устройств, которые дополняют функции BIOS компьютера, предоставляя стандартизированный интерфейс для работы с устройствами для MS-DOS. Он инициализирует базовые устройства, такие как клавиатура, экран, диски и последовательные порты.
    • SYSINIT (System Initializer): Программа инициализации, которая выполняет ряд критически важных задач.
  2. Функции SYSINIT:
    • Определяет объем доступной оперативной памяти.
    • Переносит ядро DOS (MSDOS.SYS) из временной области загрузки в его окончательное резидентное расположение в памяти.
    • Затем вызывает программу инициализации, содержащуюся в модуле MSDOS.SYS.
  3. Инициализация ядра 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. Часть 1, 2, 3. Операционная система MS-DOS. М.: ДИАЛОГ-МИФИ, 1991, 1993.
  2. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2. Аппаратное обеспечение IBM PC. Часть 1, 2. М.: ДИАЛОГ-МИФИ, 1992.
  3. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 19, MS-DOS для программиста. Часть 2. М.: ДИАЛОГ-МИФИ, 1995.
  4. INT 13H: дисковый ввод-вывод — Функции BIOS. CodeNet. URL: https://www.codenet.ru/progr/bios/int13.php (дата обращения: 07.11.2025).
  5. Что такое MBR (Master Boot Record)? ООО «Сисадмин». URL: https://www.sysadmin.ru/articles/chto-takoe-mbr-master-boot-record (дата обращения: 07.11.2025).
  6. Устройство жесткого диска. Лаборатория восстановления данных «Айкэн». URL: https://www.aican.ru/support/hdd-device.html (дата обращения: 07.11.2025).
  7. Главная загрузочная запись Роль и место mbr в загрузке компьютера (для архитектуры x86). Хабр. URL: https://habr.com/ru/articles/467657/ (дата обращения: 07.11.2025).
  8. INT 25h (37) Absolute Disk Read. ctyme.com. URL: http://www.ctyme.com/intr/rb-0431.htm (дата обращения: 07.11.2025).
  9. MFM-контроллер жёстких дисков. ASV museum of digital archaeology. URL: https://museum.asv.ru/controllers/mfm (дата обращения: 07.11.2025).
  10. Disk access using the BIOS (INT 13h). OSDev Wiki. URL: https://wiki.osdev.org/Disk_access_using_the_BIOS_(INT_13h) (дата обращения: 07.11.2025).
  11. 2. Логическая структура диска в MS-DOS. Электронная библиотека книг братьев Фроловых. URL: http://www.frolov-lib.ru/books/bsp/v19/ch2_2.html (дата обращения: 07.11.2025).
  12. INT 13h: Дисковый ввод/вывод. Низкоуровневое программирование. URL: http://lowlevel.ru/bios-int-13h-disk-io/ (дата обращения: 07.11.2025).
  13. Что такое CHS (цилиндр / головка / сектор)? NIUBI Partition Editor. URL: https://www.idiskh.com/ru/what-is-chs.html (дата обращения: 07.11.2025).
  14. HDD. Методы адресации CHS и LBA. Учебный центр «АЛГОРИТМ». URL: http://www.algoritm-ekb.ru/articles/hdd_chs_lba.html (дата обращения: 07.11.2025).
  15. Файловая система FAT (File Allocation Table – таблица размещения файлов). Lab127. URL: https://www.lab127.ru/fat.html (дата обращения: 07.11.2025).
  16. Методы адресации LBA и CHS. Жесткий диск. URL: https://harddisk-info.ru/article/metody-adresacii-lba-i-chs/ (дата обращения: 07.11.2025).
  17. Файловая система FAT16. ЭлекТРИЗоника. URL: https://elektrizonika.ru/fat16.html (дата обращения: 07.11.2025).
  18. 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).
  19. INT 13H: BIOS Disk I/O. Tech Help! URL: http://www.techhelpmanual.com/185-int_13h__bios_disk_i_o.htm (дата обращения: 07.11.2025).
  20. 1.5. Функции BIOS для работы с дисками. uchebnik.online. URL: https://uchebnik.online/informatika/funktsii-bios-dlya-rabotyi-s-diskami-10654.html (дата обращения: 07.11.2025).
  21. Файловая система FAT. programmers-site.ru. URL: http://www.programmers-site.ru/files/fs/fat.html (дата обращения: 07.11.2025).
  22. Работа с большими жесткими дисками Функции INT 13H. Data Recovery software. URL: https://data-recovery-software.net/ru/funktsii-int-13h.html (дата обращения: 07.11.2025).
  23. 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).
  24. Еще раз о FAT. cyberforum.ru. URL: https://www.cyberforum.ru/old-os/thread257963.html (дата обращения: 07.11.2025).
  25. Структура DOS. pcf.ru. URL: https://www.pcf.ru/articles.php?id=30 (дата обращения: 07.11.2025).
  26. 9. КОНТРОЛЛЕР ПРЯМОГО ДОСТУПА К ПАМЯТИ. Электронная библиотека книг братьев Фроловых. URL: http://www.frolov-lib.ru/books/bsp/v02/ch9_1.html (дата обращения: 07.11.2025).
  27. Fat. Структура тома. Формат записи каталога. Fat12, fat16, fat32. studfile.net. URL: https://studfile.net/preview/7161838/page:2/ (дата обращения: 07.11.2025).
  28. Logical block addressing. Wikipedia. URL: https://en.wikipedia.org/wiki/Logical_block_addressing (дата обращения: 07.11.2025).
  29. BIOS Translation Modes. Data Recovery Salon. URL: https://www.datarecovery.com/resource/bios-translation-modes/ (дата обращения: 07.11.2025).
  30. 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).
  31. Файловая система FAT, Загрузочная запись. Studbooks.net. URL: https://studbooks.net/1435759/informatika/faylovaya_sistema_zagruzochnaya_zapis (дата обращения: 07.11.2025).
  32. Начальная загрузка MS DOS. interface.ru. URL: https://www.interface.ru/home.asp?artId=4727 (дата обращения: 07.11.2025).
  33. Архитектура файловой системы FAT. Журнал СА 2.2004. osp.ru. URL: https://www.osp.ru/articles/2004/02/170068.htm (дата обращения: 07.11.2025).
  34. Жесткие диски в IBM PC XT и контроллеры MFM/RLL. Sensi wiki. URL: https://sensi.org/wiki/Жесткие_диски_в_IBM_PC_XT_и_контроллеры_MFM/RLL (дата обращения: 07.11.2025).
  35. СТРУКТУРА DOS | Процесс загрузки DOS. ОПЕРАЦИОННЫЕ СИСТЕМЫ. URL: http://osys.ru/os/dos/page_5.htm (дата обращения: 07.11.2025).
  36. Функции DOS — INT 25H/26H: Прямая дисковая операция чтения/записи. CodeNet.ru. URL: https://www.codenet.ru/progr/dos/int25.php (дата обращения: 07.11.2025).
  37. Восстановление данных в разделах FAT. Электронная библиотека книг братьев Фроловых. URL: http://www.frolov-lib.ru/books/bsp/v19/ch3_2.html (дата обращения: 07.11.2025).
  38. MS-DOS загрузочный сектор исходный код. Stack Overflow на русском. URL: https://ru.stackoverflow.com/questions/1360341/ms-dos-загрузочный-сектор-исходный-код (дата обращения: 07.11.2025).
  39. Прерывание BIOS. mark5.ru. URL: https://mark5.ru/programmirovanie/preopivanie-bios.html (дата обращения: 07.11.2025).

Похожие записи