Вряд ли кто-нибудь слышал об операционной системе DOS-777. А такая реально существовала. Правда, в действительности это была самая обычная MS DOS с незначительными изменениями, предназначенная для работы на единственном компьютере и выполнения одной единственной программы. Своим появлением этот клон в некотором роде обязан проблеме обратной совместимости. Но обо всем по порядку.
Новая и важная программа вдруг повела себя совершенно загадочным образом. Это настолько взбесило ее авторов, что было решено дисассемблировать MS DOS, разобраться в нюансах ее работы и найти причины странных ошибок. Сейчас, даже в запальчивости, вряд ли кто-то решится дисассемблировать, например, Windows-10 и разобраться во всех ее особенностях. Но тогда, в начале 90-х, когда ОС представляла собой три сравнительно небольших файла, их дисассемблирование и анализ заняли недели две.
Было обнаружено множество мелких особенностей, которые вряд ли кому-то сейчас интересны. Но в те времена по результатам этого анализа можно было даже заполнить недостающими названиями поля внутренних таблиц MS DOS, которые в одной из книжек серии «Библиотека системного программиста» под редакцией Фроловых (издательство «Диалог МИФИ») были обозначены как «зарезервированные».
Повторюсь, вряд ли все эти тонкости кому-то сейчас интересны, но о трех найденных нюансах, так или иначе связанных с проблемой обратной совместимости, пожалуй, стоит упомянуть.
Нюанс первый. Самые ранние «резидентные» программы, например, «SideKick», прямо по контексту команд внутри MS DOS искали адрес внутреннего флага «занятости» ОС. В следующих версиях этот контекст изменился, да и появилась документированная функция запроса флага, но несколько «старых» команд были специально перенесены в сегмент данных (на них управление не попадало), чтобы древние программы по-прежнему находили нужный контекст. На ум приходит аналогия со спуском нового корабля, получающего имя легендарного предшественника. Тогда по традиции из старого корпуса вырезается плита и крепится как мемориальная доска на новом корабле. Так вот, все версии MS DOS несли на борту маленький кусочек самой первой версии 1981 года.
Следующий нюанс был любопытнее. Оказалось, что перед запуском любого EXE-файла MS DOS проверяет среди его команд определенный контекст в определенном месте. Если он там находится – ОС слегка «раздвигает» соседние команды и добавляет команды PUSH CX и POP CX.
Поскольку в контексте присутствовала команда LOOP, очевидно, это исправление ляпа какого-то разини из MicroSoft, забывшего, что цикл портит этот регистр. Рекламный слоган: «в новой версии MS DOS даже старые программы работают лучше!» заиграл неожиданными красками. Мы не пробовали искать, какая поделка MicroSoft исправляется таким образом, зато были предложения написать свою программу с ассемблерной вставкой так, чтобы нужный код попал в нужное место. По мысли автора предложения, далее нужно всего лишь иметь зависимость от содержимого CX. Когда MS DOS вставит ненужную POP CX, поведение программы изменится, можно тащить MicroSoft в суд за вредоносные действия и трясти с нее миллионы. Но поскольку предлагавший это по судам никогда не ходил и адвокатов (тем более, американских) не нанимал, дальше трепа в курилке дело не пошло.
И, наконец, третий нюанс, который, как выяснилось, и был причиной ошибок. Это работа с двадцатой адресной линией. Для молодого поколения, которое, к счастью для себя, не сталкивалось с подобными вещами, вероятно, потребуется объяснение. Первоначальный вариант персонального компьютера с процессором 8086/8088 имел соединение с оперативной памятью двадцатью адресными линиями. Сам адрес вычислялся в команде сложением двух частей: т.н. сегмента (16 старших бит из 20) и т.н. смещения (16 младших бит из 20). Таким образом, формально можно задать две части, сумма которых больше, чем два в двадцатой степени (максимального адреса). Но ничего страшного не происходило. Перенос из последней 19-ой линии (они нумеруются с нуля) просто пропадал и получался адрес в первых 64 килобайтах.
Когда примерно в 1986 году появились 32-х разрядные процессоры и компьютеры, число адресных линий увеличились до 30 (а не до 32, поскольку нулевая и первая линии стали внутренними). Короче, появилась нормальная двадцатая адресная линия и никакого «заворота» в младшие адреса уже не получалось.
Лично я никогда не видел в программах использования трюка с «заворотом». Если такие и были, это уж совсем какая-то седая древность и дурной стиль. Но в Америке неизвестно кто для совместимости с неизвестно чем, вдруг так озаботился надуманной проблемой, что для 20-ой линии в компьютеры была добавлена электрическая схема, позволяющая ее обнулять! Прямо так и говорилось: включить и выключить двадцатую линию.
А это было время, когда дурость одного деятеля, заявившего, что «640 Кбайт хватит на все задачи» становилась все яснее и яснее. Появились всякие памяти «expanded», а как раз из-за двадцатой линии появился 64-х килобайтный уютный «чуланчик» в памяти выше мегабайта, на который первой лапу наложила сама MicroSoft и поместила туда MS DOS, немного освобождая, тем самым, пресловутые 640 Кбайт.
При этом работа с двадцатой линией внутри MS DOS заставила вспоминать поговорку про дурака и писаную торбу. При обращении к функции DOS эта адресная линия, естественно, включалась самой ОС, чтобы получить управление выше мегабайта. А при выходе из функции DOS эта линия… Думаете, восстанавливала исходное состояние? Выключалась? Включалась? Мы тоже так думали и не угадали. Оказалось, что при первом обращении к DOS и возврате в программу двадцатая линия отключалась, а при последующих обращениях (т.е. обращениях из программы с тем же PSP) оставалась включенной. Это и сбило всех с толку и при отладке (а отладчик сам обращался к функциям DOS) осталось незамеченным. А поскольку важная программа требовала много памяти для команд и данных и сама располагалась выше мегабайта, то неожиданное отключение у нее одного бита в адресе приводило к самым разнообразным эффектам.
Выход был простой: при старте один раз обратиться к DOS, например, запросить номер версии, затем включить двадцатую линию и забыть о ней как о страшном сне.
Поэтому никакой специально исправленной DOS, как мы сначала опасались, создавать не потребовалось. Но поскольку было жаль уже потраченных двух недель, вместо штатной DOS все же был использован ее клон, который вообще не дергал эту чертову двадцатую линию и имел еще несколько мелких улучшений. Этот клон и получил название DOS-777 по номеру отдела, где все это происходило.
На мой взгляд, есть и еще худшее решение о совместимости, чем фокусы с двадцатой линией. Это регистры команд MMX, совмещенные с регистрами FPU. Я читал такое объяснение этому архитектурному решению: при переключении задач, ОС запоминает контекст остановленной задачи, в том числе регистры FPU. При использовании MMX, они автоматически также будут запоминаться и восстанавливаться.
По-моему, это решение не выдерживает никакой критики: к моменту, когда реально появились программы с MMX, сменилось несколько версий (чуть не поколений) ОС, например, той же Windows. Проще было объявить, что до такого-то номера версии одновременно несколько задач с MMX работать не будут. Вместо этого теперь на веки-вечные MMX и FPU мешают друг другу. И всего лишь из-за попытки совместимости с какими-то старыми Windows времен, когда еще не было MMX, и про которые все уже давно забыли.
Таким образом, проблема обратной совместимости объективно существует, и решать ее иногда приходится. Но если в первых двух приведенных примерах решение было остроумным, и главное, скрытым для пользователей, которым эта совместимость ни к чему, то в двух последних примерах попытка совместимости (на мой взгляд, надуманная!) привела к вычурным аппаратным решениям и породила проблемы. Причем совместимость уже тогда гораздо лучше и проще обеспечивалась специально разработанным режимом виртуального 8086.
Главной же бедой любой обратной совместимости является то, что с каждым годом пользователей, которым она нужна, все меньше и меньше. А учитывать ее приходится всем.
beerware
Да, в первых BIOS была опция с А20. Недокументированные возможности DOS использовали в TSR программах.
Про достаточность 640К ляпнул Билли, ему это периодически напоминают в новых изданиях популярной книги по администрированию UNIX
DanilinS
В те времена, когда он это ляпнул, 640К это был астрономически огромный кусок памяти.
pda0
Дело даже не в этом, классический пример создания мифов и выдёргивания из контекста. Слова сказанные на компьютерной выставке в 1981 касались сравнения с текущими конкурентами. Как если бы сейчас выпустили бы домашний компьютер с терабайтом памяти (у спецсерверов такое есть уже сегодня). Было бы совершено логично сказать, что с таким компьютером вы не испытаете нехватку памяти ни с одной программой. Но народ внезапно решил неявно дополнить это утверждение словами «на все времена», что разумеется не может быть точным.
JohnSmith2
Если бы он достаточно точно формулировал свои мысли, то подобных лулзов не было бы. Можно было сказать, что 640кб хватит всем на ближайшие например 10 лет.
DanilinS
И это при условии, что он это говорил. Свидетелей нет, а сам он (Гейтс) многократно заявлял, что не произносил этой фразы.
icCE
С учетом того, что он этого не говорил, но все это ему приписывают.
Можно где то почитать про DOS-777 или хотя бы пару фактов о существовании?
Ну и на тему A20 у вас странные выводы.
Так как мне лень я тут цитаты кину
```В реальном режиме по адресации памяти декларируется полная совместимость с процессором 8086, который своей 20-битной адресной шиной охватывает пространство физической памяти в 1 Мбайт. На самом деле, на радость разработчикам программного обеспечения PC, 80286 имеет ошибку, «узаконенную» и в следующих поколениях процессоров. При вычислении физического адреса возможно возникновение переполнения, которое с 20-битной шиной адреса просто игнорируется. Если, например, Seg=FFFFh и EA=FFFFh, физический адрес, вычисленный по формуле РА=16 х Seg + EA=10FFEF, процессором 8086 трактуется как 0FFEF — адрес, принадлежащий первому мегабайту. Однако на выходе А20 процессора 80286 в этом случае установится единичное значение, что соответствует адресу ячейки из второго мегабайта физической памяти. Для обеспечения полной программной совместимости с 8086 в схему PC был введен специальный вентиль Gate A20, принудительно обнуляющий бит А20 системной шины адреса. Не оценив потенциальной выгоды от этой ошибки, управление вентилем узаконили через программно-управляемый бит контроллера клавиатуры 8042. Когда оперативная память подешевела, а «аппетит» программного обеспечения вырос, в эту небольшую область (64К-16 байт) стали помещать некоторые резидентные программы или даже часть операционной системы, а для ускорения управления вентилем появились более быстрые способы (Gate A20 Fast Control)```
```Intel разработал переход между режимами только в одном направлении. Микропроцессор начинал работу только в реальном режиме, когда происходило тестирование всех 16 Мб памяти, но для использования всего этого ресурса необходимо было перейти в защищенный режим. Иначе пользователь мог довольствоваться только 1 Мб памяти. Обратного перехода от защищенного режима к реальному не существует — требуется перезагрузка. Кроме того, защищенный режим реализовывал только частично чаяния программистов. Вся огромная память 80286 была разделена на сегменты по 64 К. Вместо того, чтобы свободно использовать весь ресурс памяти, программистам приходилось мудрствовать, чтобы преодолеть эти барьеры между сегментами.```
а софта написали не то, что много — а дохрена как много.
```В итоге это означало, что появление 32-разрядных процессоров не вызвало заметных изменений по данной теме, поскольку специальный вход процессоров (A20M — A20 Mask) остался. Упомянутый вход современного процессора есть не что иное, как маскирование бита A20 физического адреса для эмуляции адресного пространства 8086 в реальном режиме работы процессора. А это связано и с тем, адресная линия A20 используется также для переключения из реального режима в защищенный.```
P.S. А в 64 битных, для обратный совместимости появился Long Mode :)
Dukarav Автор
Ну, не знаю. А данная заметка не годится в факты о существовании? В ДОС 6.21 вручную было поправлено несколько мест, чтобы никто не трогал эту вонючую А20.
Цитат я тоже могу накидать. Замечу, что
-это только для 286, который промелькнул и исчез. Начиная с 386 такой проблемы нет, можно ходить туда-сюда.
МС поступила логично, начав городить новые ОС уже в защищенном режиме, хотя можно было ДОС перевести в 32-х разрядный реальный режим и нормально работать.
С 1995 по почти 2004 мы и работали под ДОС в 32 разрядах безо всяких DMPI и прочих ужасов. Это особенно удобно, если на компьютере бесконечно работает только одна программа, тогда ДОС является лишь загрузчиком, не сжирающим память как Windows.
Ограничение было на размер кода (но не данных) — не более 16 Мбайт. Я и сейчас на такие объемы кода не выхожу.
Могильщиком этого режима стали флешки. С ними под ДОС трудно работать.
icCE
```Ну, не знаю. А данная заметка не годится в факты о существовании? В ДОС 6.21 вручную было поправлено несколько мест, чтобы никто не трогал эту вонючую А20.
Цитат я тоже могу накидать. Замечу, что```
нет конечно.
Что значит не трогал A20?
Системе вообще на это насрать по большому счету.
в himem можно принудительно указать как работать.
```это только для 286, который промелькнул и исчез```
именно, так как костыли говно и палка начались с него
```
```аботали под ДОС в 32 разрядах безо всяких DMPI ```
и как вы трансляцию памяти делали?
И нормально не получалось, так как за спиной легоси которые надо тянуть, коотрое в общем и сейчас есть и intel обещал все это в 2020/21 выкидывать, но воз и ныне там.
```Ограничение было на размер кода (но не данных) — не более 16 Мбайт. ```
на 80286 вы можете работать с 1 гигабайтом, собственно так сервера и жили, основанные на этой платформе.
```Могильщиком этого режима стали флешки. С ними под ДОС трудно работать.```
Не вижу трудностей работы и сейчас. Хотя, что вы думаете под режимом работы, остается загадкой.
VolCh
Мой 286 работал с 4Мб памяти вполне нормально
karensummers
На тот же момент и вправду хватало. Однако язык ему тогда лучше бы и вправду было за зубами придержать)
Tangeman
Не существует хоть какого-нибудь пруфа что он вообще это говорил.
bolk
Да не ляпал это никогда «Билли», сто раз уже опровергали.