MS-DOS, который мы никогда не видели

:

Порой встречаются такие артефакты природы, что начинаешь невольно задумывать о разных конспирологических теориях и альтернативной истории. Сегодня я хотел бы поговорить о разных малоизвестных и не очень аспектах операционной системы MS-DOS. Историй про дос на хабре было огромное множество: краткие очерки, подробная хронология, мемуары ностальгирующих, но никто ни разу не отмечал про MS-DOS 4.0 от 1985 года. Я считаю это очень важным звеном развития операционных систем для IBM PC, но удивительно мало информации о таком важном переходном этапе. Это буквально утерянная ветка доса и найти про нее информацию большая проблема. Что бы вы подумали если бы услышали о поддержке в DOS вытесняющей многозадачности, виртуальной памяти, свопа, семафоров и IPC. Фантастика?

Собственно, история началась одним праздным днем, когда я в порыве прокрастинации решил немного почитать интернета вместо работы. Когда-то у меня был ноутбук Sharp PC 6200, основанный на новомодном 80286 процессоре и оснащенный двумя дисками, один HDD на 10 мегабайт, а второй ROM на 4 мегабайта. На ROM драйве были утилиты от производителя и инсталятор DOS. По замыслу разработчиков, если человек приобрел новый винчестер, то он мог его разбить, отформатировать и установить дос прямо встроенными в ноутбук средствами. Вероятно, такое решение было продиктовано отсутствием в ноутбуке дисковода, но для меня оно было весьма оригинальным и свежим. Я уверенно помнил что там был DOS 4.0 и мне захотелось узнать больше о нем, тем более что о нем ходила слава как о неудачной системе, но конкретики я не знал.

Буквально с первого запроса я получил очень много противоречий в выдаче. Расходилось буквально все, начиная от перечня проблем и заканчивая датой выхода. Отдельно следует заметить, что в те дикие времена говорить о релизе доса не приходится. MS DOS до пятой версии не продавался в свободной продаже, Microsoft работала исключительно на производителей оборудования и корпоративный сегмент, поэтому версии тех времен известны либо по купленным образцам техники с предустановленной системой, либо по утекшим версиями из предприятий. Кроме того дос тех времен был практически голым, только несколько совсем важных системных утилит, а из совсем уж прикладного софта можно отметить только ассемблер/дизассемблер/отладчик DEBUG, линейный текстовый редактор EDLIN да BASIC в некоторых версиях. Получив голую систему в ней было практически нечего делать, но это больше веяние тех дней. Но и компьютер обычно покупался с вполне определенной целью и скорее ОС выбиралась под софт, а не наоборот. Особо интересно на этом фоне выглядит CP/M 86, в составе которой в то время был визуальный текстовый редактор, компилятор ассемблера и бейсика. Впрочем, вернемся к нашему DOS. На некоторых сайтах я находил свидетельства о том что DOS 4.0 была принципиально новой операционной системой и в ее ядре были проведены огромные изменения, по самому минимуму: новая файловая система FAT16 которая позволяла использовать винчестер более 32 мегабайт, для этого в ядре появилась VFS позволявшая успешно работать одновременно с двумя разными файловыми системами, вплоть до многозадачности, семафоров и разделяемой памяти. По свидетельствам очевидцев в версии 4.01 систему причесали, многозадачность заблокировали и выпустили работоспособную систему.

Тут я, мягко говоря, очень удивился. Я отчетливо помню что никакой многозадачности и разделяемой памяти не было на ноутбуке а версия была строго равна 4.00. Но почувствовал, что тема явно интересна и мало изучена. Тогда постепенно начала вырисовываться правда. Оказывается существует две версии 4.00, одна из них, всем известная, вышла в 1988 и основана на 3.30, другая вышла в конце 1985, основана на 2.1 с частями от 3.1 и обладает всеми этими магическими свойствами. Для их отличия версию 1985 в народе называют 4.00M.

На этом моменте меня уже совсем перестали интересовать баги обычной четвертой версии и я начал охоту за образами многозадачной версии. Я собрал порядка десяти разных версий MS DOS 4.0 для разных вендоров, среди которых была даже Nokia (вот откуда растут ноги их сотрудничества), попутно обнаружив исходники MS DOS 3.3, но того самого 4.00M не было. И вот образы были обнаружены, да не просто, а прям в on-line x86 эмуляторе.

Система состояла из двух дискет, где имелось, собственно, ядро операционной системы и совсем минимальный набор утилит. Никаких документов не содержалось. Никакой помощи. Более того, даже ключ /? не присутствует у всех команд! Но основной функционал видно и так. По правому альту выпадал список задач, в котором можно было создать новый процесс или переключиться между имеющимися. Что, в общем, не особо меня впечатлило. Я даже не был уверен что это аутентичная версия от Microsoft, а не мистификация на слухах в сети. Собственно это мы и будем доказывать. Тем более тот факт, что многозадачность реализуется некой нашлепкой сверху SM.EXE, говорит в пользу этой версии. Вот содержание CONFIG.SYS:

BUFFERS=20
FILES=40
SHELL=c:\dos\sm.exe c:\command.com

Дальнейшее исследования показало несколько странностей. Во-первых это .PIF файлы которые были на дискетах, что роднило этот DOS с Windows. На второй дискете обнаружился PIFEDIT.EXE и первый долгожданный документ: swapper.doc.

swapper.doc
; Swapper.doc
;
;   SCCSID = @(#)swapper.doc    6.1 85/10/09

Using the Dos 4.00 partition swapper.

1. You must add the swapper, swapper.exe, to the autoexec.bat file.  Add
   the following lines:

    memset default = 5
    detach swapper
    memset default = 127

   This allows the swapper to run in a minimum amount of space.

   Note the swapper MUST run in backround.

2. The above configuration will cause the swapper to default to the
   root directory of c: drive for locating its swap files.  You may
   tell the swapper where to place the swap files by specifying
   the drive and also the directory.  You must always specify the
   drive and the swapper will default to the root directory of the
   drive.  Example:

    detach swapper d:
   or
    detach swapper c:\tmp

3. The swapper will manage the cleanup of its swap files.  If the
   swap directory is changed after a system crash, there is the
   chance that swap files will be left around.  These can be removed
   by executing the following on the "old" swap directory:

    del *.swp

Currently ANY task can be swapped, so use with caution until this is
resolved.  If you don't want to have swapping, then remove "detach
swapper" from the autoexec.bat file.

Это уже начинает быть по-настоящему интересным. Во-первых видна дата: 9 октября 1985, во-вторых виден размах деятельности. Отдельно стоит отметить, что это только октябрь 1985, а первая версия Windows была выпущена только в ноябре. То есть технология PIF еще не вышла за стены Microsoft. Утилита для управления памятью MEMSET, настоящие фоновые процессы, а не обрезанные TSR, работающие на перехвате векторов прерываний. Виртуальная память и возможность выгрузки сегментов на диск. Я тут же попробовал запустить что-то командой detach и получил ответ в виде PID запущенного процесса. Интересно что если попробовать запустить интерактивную команду в бекграунде, то ее вывод перекрывается с текущей консолью, а она тут же получает символ конца файла ^Z и закрывается. Если запустить FDISK, то портятся настройки терминала. Они не восстанавливаются даже если завершить сеанс этого терминала и открыть заново. То есть терминалы выделяются статически. Интересно что CLS не работает как полагалось, а просто выводит ESC последовательность. То есть терминалы сильно ушли от прямого доступа к памяти и должны управляться через ANSI. ANSI драйвер был, но я его не загружал. Тут я уже сильно засомневался о мистификации с таким размахом. Так что оставим эмулятор и перейдем непосредственно к вскрытию.

Скачав образы, я извлек все содержимое в отдельный каталог. Образы проверил на удаленные файлы но все оказалось чисто. Призрачная надежда найти что-то еще исчезла. Так что приступим. Для начала отметим что структура файлов серьезна изменилась. Например popup.exe: MS-DOS executable, NE (unknown OS) (driver) или queuer.exe: MS-DOS executable, NE for MS-DOS, и даже attrib.exe: MS-DOS executable, NE for MS Windows 3.x. Хотя файл отлично запускается. Так что это скорее всего глюк утилиты file, или просто формат файла еще не полностью стандартизирован.
Файлы содержат заголовок более похожий на PE, чем на то, с чем привыкли работать в дос. Видно оригинальное имя файла и список импортируемых экспортируемых символов называемых тут DOSCALLS, то есть видимо была попытка реализовать что-то подобное разделяемым библиотекам или IPC.
Версия определена таким образом

MS-DOS version 4.00
Copyright 1981,82,83,84,85 Microsoft Corp.

$nternal revision 6.7, 85/11/26

Интересно заметить что символ $ означает конец строки в досе, то есть сообщение о внутренней ревизии было грубо вырезано из вывода, но осталось в файле. Далее приведем просто список интересных анахронизмов и удивительных вещей.
  • Список DOSCALLS: ALLOCSEG, REALLOCSEG, FREESEG, LOCKSEG, UNLOCKSEG, GETSEGSIZE, GETDSHANDLE, CRITENTER, CRITLEAVE, FCRITENTER, FCRITLEAVE, PBLOCK, PRUN, SUBSCREEN, GETPIDS, DOSDISCARDCODE, DOSGETHANDLE, DOSHANDLEJUMP. Видны операции выделения памяти а так же механизмы синхронизации, критические секции и GETPIDS для получения списка процессов. Что интересно я не нашел способа получить список процессов для пользователя. Только, так сказать, список приложений.
  • В ядре видны интересные пути, например \SHAREMEM\, \SEM\, а в других файлах \SHAREMEM\SMPGNAME, \SHAREMEM\SMDATA1, \SHAREMEM\PRINTQUE, \SEM\PRINT.INS, \SEM\PRINT.GO которые показывают как работает разделяемая память и семафоры
  • С помощью PIFEDIT можно создать для бинарного файла .PIF с описанием необходимых флагов(например запуск в бекграунде и использование 8087) и ограничения памяти. Кроме того эти настройки можно сохранить непосредственно в NE EXE.

  • COMMAND.COM умеет загружать не только BAT, COM и EXE, но и PIF.
  • Содержащийся link4.exe является линкером исполняемых файлов который умеет NE формат. Интересно что в MS-DOS 4.0 от 1988 используется третья версия линкера, а тут четвертая. Также интересно отметить что линкер является базовым компонентом системы, но нет ни единого компилятора, позволяющего получить .org. Это можно объяснить тем, что для новой версии можно было использовать старые компиляторы, но из-за нового формата — новый линкер.
  • Драйвера даже стандартных устройств лежат отдельно, имеют небольшие версии и строки при запуске, которых не было раньше, например — Installing Com Device Driver V1.02 ---. Наверняка это связано с изменением внутреннего представления устройств.
  • В файлах содержится достаточно много посторонних строк, о имени исходного файла, которых нет в релизе. Их изредка можно найти в модифицированных OEM версиях, но не в базовых. Тут же их очень много, что дает некоторое представление о структуре дерева исходного кода и датах.
    версии
    dos/append.exe:@(#)append.c 1.1 85/10/09
    dos/assign.exe:@(#)assign.c 6.1 85/10/23
    dos/attrib.exe:@(#)attrib.c 6.1 85/10/24
    dos/fdisk.exe:@(#)fdisk.c 1.1 85/10/09
    dos/fdisk.exe:@(#)fddata.c 1.1 85/10/09
    dos/fdisk.exe:@(#)fdlow.c 1.1 85/10/09
    dos/fdisk.exe:@(#)fdsub.c 1.1 85/10/09
    dos/join.exe:@(#)joinsbst.c 6.3 85/11/08
    dos/join.exe:@(#)sysvar.c 6.2 85/11/08
    dos/join.exe:@(#)cds.c 6.2 85/11/08
    dos/join.exe:@(#)dpb.c 6.1 85/11/08
    dos/label.exe:@(#)label.c 6.1 85/10/24
    dos/link4.exe:@(#)newdef.y 6.2 85/10/14
    dos/link4.exe:@(#)ms4bnr.c 1.1 85/10/15
    dos/mode.exe:@(#)mode.c 6.2 85/10/24
    dos/pifedit.exe:@(#)getkey.c 6.1 85/10/25
    dos/pifedit.exe:@(#)pifmes.c 6.1 85/10/25
    dos/pifedit.exe:@(#)advpscrn.c 6.1 85/10/25
    dos/pifedit.exe:@(#)advescrn.c 6.1 85/10/25
    dos/pifedit.exe:@(#)usrscrn.c 6.1 85/10/25
    dos/pifedit.exe:@(#)rangers.c 6.1 85/10/25
    dos/subst.exe:@(#)joinsbst.c 6.3 85/11/08
    dos/subst.exe:@(#)sysvar.c 6.2 85/11/08
    dos/subst.exe:@(#)cds.c 6.2 85/11/08
    dos/subst.exe:@(#)dpb.c 6.1 85/11/08
    dos/swapper.doc:@(#)swapper.doc 6.1 85/10/09
    ega.sys:@(#)BIOSMSYN6.1
    ega.sys:@(#)scrinit.asm 6.3 85/11/14
    ibmbio.com:@(#)BIOSMSYN6.1
    ibmbio.com:@(#)ibmbio.asm 6.4 85/11/25
    ibmbio.com:@(#)scrinit.asm 6.3 85/11/14
    ibmbio.com:@(#)ibmprint.asm 6.3 85/11/14
    ibmbio.com:@(#)ibmatdsk.asm 6.3 85/11/14
    ibmbio.com:@(#)ibmdsk.asm 6.3 85/11/14
    ibmbio.com:@(#)sysini.asm 6.4 85/11/14
    ibmdos.com:@(#)msinit.asm 6.7 85/11/26

  • Из предыдущего пункта видно повальное использование Си в этой версии дос. Большинство утилит для DOS 3.30 были кодированы на ассемблере.
  • Часть утилит взята без изменений из других версий, например CHKDSK из 3.0, DISKCOPY из 2.0, и достаточно в старом формате файла.
  • Даже в такой внутренней версии практически нет юмора и минимум отладочной информации, все что я смог найти это Abort .Retry .Ignore .Fail .Huh?.. и Terrible error, unknown control packet
  • Никаких имен живых людей или чего-то похожего на ник не было. Более того, даже стандартной фразы ©Copyright 1988 Microsoft CorpLicensed Material — Property of Microsoft которая есть во всех файлах релиза не содержиться ни в одном из файлов!
  • Совсем уж мозговыносящие строки типа \DEV\NUL и Can't open \dev\con, а каталог с исполняемыми файлами называется BIN. Я уже не раз читал что множество работников Microsoft того времени были поклонниками Unix.

Теперь проверим это чудо на совместимость с программами из MS DOS. Для этого у нас есть vc.com, rkega.com, sdrv.com, zork и captain comic. Тут мы и получаем первое разочарование. Ни волков, ни драйвер русского, ни синтезатор речи не могут быть инсталированы. Zork играет отлично, задачи переключаются. поиграть в CC можно, но после переключения графика ломается. qbasic запускается, но если переключится из него, а потом в него, то система виснет. Вобщем, совместимость есть только с программи которые ведут себя очень тихо, пользуются стандартным API и никогда, никогда не лезут в структуры DOSа напрямую. ТSR отсуствует как класс. Видимо прямой доступ к видеопамяти тоже не привествуется. Собственно возможно именно из-за этого пункта проект не получил будущего.

Конечно, можно еще достать дизассемблер и продолжить более глубокий анализ, но я думаю что пока с технической стороной можно закончить. Зато интересна еще политическая и историческая сторона. В итоге находим собрание разной информации о дос от PC DOS Lead-developer из IBM, среди которой находится страница о 4.0M:

Multitasking MS-DOS 4.0 was a little known and separate development of DOS done in parallel with the development of DOS 3.x in 1985. It should not be confused with the later retail DOS 4.0 that was released in 1988. DOS 4.0 supported preemptive multitasking, shared memory, semaphores, advanced memory management, a session manager, imports, exports and a new executable format. Many of the ideas and features introduced here found their way into OS/2. Unfortunately DOS 4.0 was limited by the real-mode 8086 environment and the 640KB address space. Also programs which were not well-behaved or relied upon undocumented DOS functions would not run properly under DOS 4.0, particularly TSR programs.

И ссылка на блог разработчика этой версии Larry Osterman, где мы можем узнать совершенно удивительные вещи:

MS-DOS 4.0 was unique because it was developed “on spec” – IBM didn’t see a need for a multitasking version MS-DOS and didn’t have a new hardware offering on which to attach the product. But IBM did have the PC/AT which was an 80286 based processor and it didn’t have an OS that took advantage of that hardware. So IBM and Microsoft started negotiations to take the MS-DOS 4.0 code base and turn it into what eventually turned into OS/2. I ended up not working on the OS/2 effort, instead I worked on finishing up MS-DOS 4.0 for the OEM partners who had licensed MS-DOS 4.0.

Выходит все же эта версия не пропала зря, это не только предок OS/2 а буквально ее личинка, многие технологии которые были использованы тут разделены с Windows того времени и перешли прямиком в OS/2. Однако на всех исторических сайтах история OS/2 начинается в 1987 и выпуска OS/2 SDK, а это — переходное звено которое всеми забыто и даже не упоминается.

PS:

$ file append.exe
append.exe: MS-DOS executable, NE for OS/2 1.x