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

в 10:17, , рубрики: История ИТ

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 эмуляторе.

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

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

BUFFERS=20
FILES=40
SHELL=c:dossm.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, во-вторых виден размах деятельности. Утилита для управления памятью MEMSET, настоящие фоновые процессы, а не обрезанные TSR работающие на перехвате векторов прерываний. Виртуальная память и возможность выгрузки сегментов на диск. Я тут же попробовал запустить что-то командой detach и получил ответ в видео PID запущеного процесса. Я уже сильно засомневался о мистификации с таким размахом. Так что оставим эмулятор и перейдем непосредственно к вскрытию.

Скачав образы я извлек все содержимое в отдельный каталог. Образы проверил на удаленные файлы но все оказалось чисто. Призрачная надежда найти что-то еще исчезла. Так что приступим. Для начала отметим что структура файлов серьезна изменилась. Например 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, а в других файлах SHAREMEMSMPGNAME, SHAREMEMSMDATA1, SHAREMEMPRINTQUE, SEMPRINT.INS, SEMPRINT.GO которые показывают как работает разделяемая память и семафоры
  • С помощью PIFEDIT можно создать для бинарного файла .PIF с описанием необходимых флагов(например запуск в бекграунде и использование 8087) и ограничения памяти. Кроме того эти настройки можно сохранить непосредственно в NE EXE.
    MS DOS, который мы никогда не видели
  • COMMAND.COM умеет загружать не только BAT, COM и EXE, но и PIF.
  • Содержащийся link4.exe является линкером исполняемых файлов который умеет NE формат. Интересно что в MS-DOS 4.0 от 1988 используется третья весрия линкера, а тут четвертая. Также интересно отметить что линкер является базовым компонентом системы.
  • Драйвера даже стандартных устройств лежат отдельно, имеют небольшие версии и строки при запуске, которых не было раньше, например — 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 которая есть во всех файлах релиза не содержиться ни в одном из файлов!
  • Совсем уж мозговыносящие строки типа DEVNUL и Can't open devcon

Теперь проверим это чудо на совместимость с программами из 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

Автор: maroziza

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js