Роберт В. Оливер II

Чистая ретро-радость

Когда я узнал, что исходный код Microsoft MS-DOS был одним из самых популярных репозиториев на GitHub, я пришел в восторг.

Если вы читали какие-либо из моих сообщений в блоге, то знаете, что я большой поклонник ретро-вычислений. Я затронул различные темы, такие как разработка видеоигр для MS-DOS и собрал простую 16-битную операционную систему под названием Retrokern. В разговоре с другими разработчиками, которые являются энтузиастами ретро, ​​мы часто с энтузиазмом говорим о проблеме создания полнофункционального программного обеспечения и игр в самых ограниченных пространствах. Именно эта острая нехватка аппаратных ресурсов стимулировала изобретательность и породила целую золотую эру компьютерных вычислений.

В 2014 году Microsoft выпустила исходный код для MS-DOS 1.25 и 2.0. Эти версии, выпущенные в 1981 и 1983 годах соответственно, были лицензированы как IBM (под торговой маркой PC-DOS), так и производителями клонов IBM-PC и OEM (производители оригинального оборудования). В эпоху версий 1.x и 2.x выпуски DOS были адаптированы к производителю из-за значительных различий в совместимости с BIOS. Благодаря аппаратной абстракции IO.SYS (иногда называемой IBMBIO.COM) Microsoft потребовалось изменить только этот относительно тонкий слой, чтобы позволить своей операционной системе работать на большом количестве машин на базе 8086.

Изучение источника

В нашем путешествии по полосе памяти 640 КБ мы будем исследовать версию 2.0. Это не только самый последний из перечисленных источников, но он также имеет более сильное сходство с более поздними версиями DOS.

Прежде чем мы перейдем к конкретным сегментам, давайте обсудим язык программирования MS-DOS 2.0 - ассемблер x86. Почти весь системный уровень и программирование игр в первые дни DOS выполнялись на ассемблере. Для операционной системы требуется некоторая сборка, особенно в загрузчике. Поскольку в 80-е годы процессорные циклы и байты памяти были невероятно дорогими, все ядро ​​MS-DOS и связанные с ним утилиты были написаны на ассемблере.

Загрузка DOS

Когда компьютер с поддержкой BIOS (практически любой ПК, сделанный в 80-х, 90-х и 2000-х) загружается, BIOS выполняет различные самопроверки и устанавливает собственные векторы прерываний (таблицы вызовов функций для программных прерываний), а затем загружает первый сектор загрузочного диска и передает ему управление. Операционная система имеет очень маленькое окно кода, доступное для загрузки остальной системы с диска и передачи ей выполнения. Это обрабатывается в основном в файле SYSINIT.ASM.

На заре DOS это было не слишком сложно, но по мере того, как оборудование и файловые системы становились все более сложными, стало ясно, что миру ПК нужен лучший загрузчик. Таким образом, родился стандарт UEFI (универсальный расширяемый интерфейс прошивки), используемый как компьютерами Mac, так и ПК. Несмотря на поддержку огромных жестких дисков, процессоров x86_64 и аппаратного обеспечения, о которых в 1980-е и не снилось, система UEFI включает унаследованный уровень BIOS, имитирующий то же поведение при начальной загрузке, которое ожидает операционная система, такая как MS-DOS 2.0.

Ядро MS-DOS

Аппаратная абстракция и уровень ввода / вывода, называемый IO.SYS, по сравнению с ядром MS-DOS, MSDOS.SYS, составляют ядро ​​системы. Многие файлы в дереве исходных текстов объединяются для создания этих двух файлов. Эти файлы предоставляют различные процедуры, которые доступны через прерывания, а именно int 0x21 (или обозначаемый как 21h, «h» для шестнадцатеричного).

Это программное прерывание позволяет программам DOS распределять память «безопасным» способом (я использую кавычки, потому что распределение памяти DOS было далеко не идеальным), обращаться к файловой системе и отображать текст на экране. Эти вызовы функций гораздо более переносимы, чем вызовы BIOS, поскольку спецификации BIOS редко бывают полностью совместимыми. Функции ядра DOS обеспечивают безопасный способ удовлетворить большинство потребностей программы.

Однако, когда скорость была критичной, программы часто игнорировали DOS и напрямую использовали оборудование. Особенно это касалось отображения текста. Утилиты командной строки нормально справлялись с вызовом 0x09 int 0x21 для печати текста (завершается знаком $), но сложные приложения или игры часто записывали на экран прямо на 0xB800.

Командный интерпретатор

COMMAND.ASM предоставляет исходный код той части DOS, с которой взаимодействовало большинство пользователей - интерпретатора команд. Он часто был известен под своим двоичным именем COMMAND.COM. После загрузки ядра запускается командный интерпретатор. Программа была уникальна тем, что состояла из трех уникальных частей: init, transient и resident.

Часть init COMMAND.COM загрузила остальные части, обработала файл AUTOEXEC.BAT (сценарий, запускаемый при каждой загрузке с командами запуска), а затем передала управление временной части.

Переходная часть обрабатывала цикл пользовательского ввода. Он будет отображать командную строку, ждать ввода пользователя, а затем обрабатывать эти команды. Переходная часть оставалась в памяти во время выполнения программы, но считалась изменчивой. Программы, которые использовали значительный объем памяти, перезапишут этот раздел. Во время выполнения программы в этом не было необходимости, так что это было вполне приемлемо.

Жилая часть присутствовала всегда. Он включал код, необходимый для запуска и завершения программ, а также обработки их исключений (включая исключение, созданное пользователем CTRL + C). Он также включал код, который перезагружал переходную часть из файла COMMAND.COM.

В более поздних версиях DOS интерпретатор команд можно было заменить другой программой. Популярными альтернативами были 4DOS от JP Software и NDOS от Norton. Эти альтернативы предоставили пользователю DOS дополнительные функциональные возможности и функции, обеспечивающие повышенное качество жизни.

Утилиты DOS

MS-DOS была больше, чем просто загрузчиком и интерпретатором команд - она ​​поставлялась с различными утилитами для форматирования дисков, управления файлами и отладки программного обеспечения. Давайте рассмотрим несколько интересных программ, которые были включены в MS-DOS 2.0.

КОПИРОВАТЬ

Достаточно интересно, что утилита копирования, используемая для копирования файлов из одного места в другое, была не отдельной программой, а скорее частью временной части командного интерпретатора. Если программа хотела скопировать файл, она либо должна была сделать это сама, либо создать другой командный интерпретатор и запустить для этой цели свою команду копирования.

Исходный код для копирования можно найти в v2.0 / source / COPY.ASM. Он включен в более крупный файл COMMAND.ASM. Как и в случае с большинством ассемблерного кода, различные подпрограммы внутри функции копирования разделяются метками (указываемыми именем с продолжающимся двоеточием). Эти метки были переведены ассемблером в адреса JMP (переходные).

Интересный артефакт находится в строке 120:

mov [MELCOPY],al ; Not a Mel Hallerman copy

Мел Халлерман был сотрудником IBM, которому приписывают создание некоторых утилит, включенных в MS-DOS 2.0. К сожалению, я не смог найти ни документации по коду, ни внешних справочных материалов, которые бы подсказали, почему подпрограмме было дано такое имя.

DIR

Таблица размещения файлов (FAT) - это существующий на диске каталог, указывающий на абсолютные местоположения различных файлов и подкаталогов. Вместо просмотра этого двоичного каталога утилита «dir», встроенная в COMMAND.COM, интерпретирует его и отображает в удобном для пользователя виде.

Исходный код этой команды можно найти в DIR.ASM. Как и COPY.ASM, он компилируется в файл COMMAND.ASM для включения в переходную часть интерпретатора команд.

CHKDSK

В MS-DOS 2.0 появились каталоги. Файлы больше не должны находиться в корневом каталоге, и пользователи могут создавать файловую и папочную систему в соответствии со своими потребностями. Хотя это было большим достижением для Microsoft, эта система каталогов не идеальна. Когда он выходил из строя, а иногда это происходило во время отключения электроэнергии и резких зависаний, CHKDSK обычно был первым развернутым средством восстановления.

Код для CHKDSK, соответственно, находится в CHKDSK.ASM. Это впечатляющий фрагмент кода, который может спасти данные во многих случаях поврежденной FAT.

Как ни странно, до DOS 3.x команда DIR не показывала пользователю, сколько свободного места на диске осталось. Утилита CHKDSK была наиболее распространенным способом получения этой информации.

EDLIN

MS-DOS 5 и более поздние версии включали EDIT, текстовый редактор с меню, простой в использовании. Но до этого пользователи MS-DOS часто полагались на EDLIN.

Эдлин был линейным редактором, написанным Тимом Паттерсоном для 86-DOS, предшественника MS-DOS 1.0. Я указываю редактор строк, потому что вместо того, чтобы принимать текст произвольной формы, как большинство других редакторов, пользователь мог вводить только одну строку за раз. Чтобы отобразить уже написанный текст, пользователь может использовать команду «L» или поставить перед ней цифры, чтобы указать строки для отображения. Вставка текста среди того, что уже было введено, была рутинной работой - пользователям нужно было повторно добавить текст и использовать команду «I» (перед которой стоит номер строки), чтобы начать вставку текста.

Хотя Эдлин не был известен своим интуитивно понятным интерфейсом, он был довольно мощным в определенных обстоятельствах, предоставляя отличную функцию поиска и замены и позволяя пользователям удалять несколько строк всего несколькими нажатиями клавиш.

ОТЛАЖИВАТЬ

Если вы не приобрели ассемблер или компилятор, писать программы для DOS было сложно. Поскольку в базовый пакет не было включено никаких значительных утилит для разработки, программисты-любители столкнулись с проблемой курицы или яйца. Не имея возможности кодировать команды сборки в двоичный код, который использует процессор x86, они застряли в записи командных файлов в EDLIN.

Я лично испытал это на своем первом компьютере под DOS. Я был подростком без работы, поэтому тратить деньги на разработку программного обеспечения было невозможно. Пока я не смог приобрести лучшие инструменты, я часто писал программы на ассемблере в DEBUG.

Процесс ввода программ в DEBUG был утомительным, но, как следует из названия, он позволял мгновенно отлаживать указанный код. DEBUG мог писать только файлы .COM, то есть мои программы не могли быть больше 64 КБ, но этого было более чем достаточно для удовлетворения моих потребностей в программировании, пока я позже не приобрел более профессиональные инструменты.

DEBUG также отлично подходит для дизассемблирования и исправления кода. Если файл был программой .COM, вы могли исправить проблемный код и записать файл обратно на диск, предоставив примитивный, но эффективный шестнадцатеричный редактор.

Исходный код DEBUG.COM можно найти в DEBUG.ASM.

Дальнейшие исследования

Код хорошо документирован, но для некоторых команд, таких как FORMAT, предоставляется текстовый файл с подробным описанием работы программы и структуры исходного кода. Я нашел эти файлы весьма полезными при исследовании этого древнего сокровища.

Будущее DOS

Вы не поверите, но новое ПО для DOS все еще пишется. И в Интернете вы найдете сообщения о компьютерах DOS, которые все еще используются в различных коммерческих приложениях. Джордж Р.Р. Мартин использует WordStar, текстовый процессор на основе DOS, для своей серии книг Игра престолов. Личность YouTuber и Linux Брайан Лундук испытал 30-дневную вычислительную нагрузку в 1989 году и, насколько я слышал, до сих пор использует программу электронных таблиц DOS. Один мой хороший друг использует среду DOS, не отвлекающую внимание, для выполнения серьезной работы.

Я не буду делать вид, что DOS - это операционная система будущего. Это было бы в лучшем случае невероятно наивно. Но тот факт, что эта операционная система, которой почти сорок лет, все еще находится в различных воплощениях, включая популярный клон FreeDOS, поражает.

Я призываю вас на минутку задуматься над этой мыслью - мы все еще загружаем компьютеры и пишем программное обеспечение для операционной системы, написанной почти четыре десятилетия назад, когда Джимми Картер был президентом.