В вычислительной технике DOS Protected Mode Interface ( DPMI ) — это спецификация, представленная в 1989 году, которая позволяет программе DOS работать в защищенном режиме , предоставляя доступ ко многим функциям новых процессоров ПК того времени, недоступным в реальном режиме . Первоначально он был разработан Microsoft для Windows 3.0 , хотя позже Microsoft передала контроль над спецификацией отраслевому комитету с открытым членством. [1] [2] Почти все современные расширители DOS основаны на DPMI и позволяют программам DOS обращаться ко всей памяти, доступной на ПК, и работать в защищенном режиме (в основном в кольце 3, с минимальными привилегиями). [3]
DPMI означает DOS Protected Mode Interface (интерфейс защищенного режима DOS). Это API , который позволяет программе работать в защищенном режиме на процессорах серии 80286 и более поздних, а также выполнять вызовы в реальном режиме без необходимости вручную настраивать эти режимы ЦП. DPMI также предоставляет функции для управления различными ресурсами, в частности памятью . Это позволяет программам с поддержкой DPMI работать в многозадачных ОС, позволяя ядру ОС распределять такие ресурсы между несколькими приложениями. DPMI предоставляет только ту функциональность, которая должна быть реализована в режиме супервизора . Его можно рассматривать как однозадачное микроядро . Остальная функциональность доступна программам с поддержкой DPMI через вызовы служб DOS и BIOS реального режима , что позволяет самому API DPMI оставаться в основном независимым от DOS. То, что делает API DPMI специфичным для DOS, — это всего 3 функции для управления памятью DOS и буква «D» в аббревиатуре «DPMI».
Служба DPMI может быть 16-битной, 32-битной или «универсальной» и называется ядром DPMI , хостом DPMI или сервером DPMI . Она предоставляется либо операционной системой хоста ( виртуальный хост DPMI ), либо расширителем DOS ( реальный хост DPMI ). Ядро DPMI может быть частью расширителя DOS, например, DOS/4GW или DOS/32A , или отдельным, например, CWSDPMI или HDPMI .
Основное применение API DPMI — позволить расширителям DOS предоставлять среду, не зависящую от хостовой ОС. Расширитель DOS проверяет наличие ядра DPMI и устанавливает свое собственное, только если оно еще не установлено. Это позволяет программам с расширением DOS работать либо в многозадачной ОС, которая предоставляет собственное ядро DPMI, либо непосредственно под DOS на голом железе , в этом случае расширитель DOS использует собственное ядро DPMI. Ядра пользовательского режима Windows 3.x и 9x построены с расширителем DOS, поэтому они полностью полагаются на API DPMI, который предоставляется ядром Windows ring-0.
Первые черновики спецификации DPMI были опубликованы в 1989 году Ральфом Липе из Microsoft. [4] [1] Хотя эта реализация основывалась на прототипической версии DPMI для Windows 3.0 в 386 расширенном режиме, несколько функций этой реализации были удалены из официальной спецификации, включая функцию под названием MS-DOS Extensions [5] или перевод DOS API , предложенную Ральфом Липе в первоначальных черновиках. [6] Большая ее часть реализовывала интерфейсы DOS и BIOS (из-за этой истории некоторые API INT 21h, такие как 4Ch, должны быть реализованы всеми реализациями DPMI). Версия DPMI 0.9 была опубликована в 1990 году недавно сформированным комитетом DPMI. Номер версии 0.9 итоговой спецификации был выбран, чтобы отразить урезанную природу и незавершенный статус стандарта, с которым смогли согласиться члены комитета DPMI. [1] Хотя Windows сообщает о версии DPMI 0.9 для совместимости, на самом деле она реализует и другие части, поскольку они представляют собой важную часть системы. [5] [1] Эта недокументированная полная природа DPMI стала известна в отрасли как « истинный DPMI ». [7] Стандарт DPMI был не единственной попыткой преодолеть недостатки спецификации VCPI . В то же время, когда Microsoft разрабатывала DPMI для Windows 3.0, другой отраслевой альянс, включая Intel's Software Focus Group , [8] [1] Lotus , [8] Digital Research , Interactive Systems и другие, разработал спецификацию под названием Extended VCPI ( XVCPI ), чтобы сделать возможности управления памятью и многозадачности 386 доступными для расширенных приложений DOS. [8] [1] [9] Когда выяснилось, что предложение Microsoft DPMI решает ряд схожих проблем и было поддержано Windows, эти усилия привели к созданию Комитета DPMI в феврале 1990 года во время встречи в Intel в Санта-Кларе. [8] [1]
В 1991 году Комитет DPMI пересмотрел DPMI до версии 1.0, чтобы включить ряд разъяснений и расширений, но он все еще не включал отсутствующие биты "истинного DPMI", реализованные в Windows. Фактически, "истинный DPMI" никогда не становился частью официальной спецификации DPMI, и Windows также никогда не реализовывал расширения DPMI 1.0 (и не многие хосты DPMI это делали).
Хотя DPMI предназначен для запуска расширенного программного обеспечения приложений DOS в защищенном режиме и расширенной памяти, [10] он не очень хорошо подходит для резидентных расширений системы. Другая спецификация, называемая DPMS , [10] разработанная Digital Research / Novell около 1992 года, специально посвящена требованиям легкого перемещения модифицированного программного обеспечения драйверов DOS в расширенную память и запуска их в защищенном режиме, тем самым уменьшая их обычный объем памяти до небольших заглушек . Это также поддерживается Helix Cloaking .
«Метод» DPMI специфичен для DOS и IBM PC. Другие типы компьютеров были обновлены с 16-разрядных до 32-разрядных, а расширенная поддержка программ была обеспечена путем обновления операционной системы с помощью нового 32-разрядного API и новых возможностей управления памятью/адресации. Например, основная система OS/2 поддерживает 32-разрядные программы и может работать без графического интерфейса. Решение DPMI, по-видимому, в основном необходимо для удовлетворения потребности третьих сторон в том, чтобы программы защищенного режима DOS стабильно работали на Windows 3.x до того, как доминирующий поставщик операционных систем Microsoft сможет или захочет заняться будущим 32-разрядной Windows. Кроме того, Microsoft не видела ответа на 32-разрядный переход в виде 32-разрядной DOS, а скорее 32-разрядной Windows с совершенно другим (и несовместимым) API.
В то время как Windows 3.0 реализует "истинный DPMI" [5] и сообщает о поддержке DPMI 0.9, [11] DPMI версии 1.0 никогда не был реализован в Microsoft Windows , поэтому большинство программ и расширителей DOS в основном были написаны только для версии 0.9. Однако немногие расширители реализуют "истинный DPMI".
Бета-версии Qualitas 386MAX реализовали «истинный DPMI» и могли запускать Windows KRNL386.EXE из командной строки, но во внутреннем письме было заявлено, что это было отключено в выпущенном продукте. [5] Однако DPMIONE (Боба Смита на основе кода 386MAX) может это делать. В настоящее время DPMIONE и 386 MAX также являются единственными хостами DPMI, которые полностью поддерживают DPMI 1.0 (например, незафиксированную память), и они являются основными сторонниками DPMI 1.0. [12]
KRNL386.SYS (он же «MultiMAX») из DR DOS «Panther» и «StarTrek» , который разрабатывался с 1991 года, [nb 1] и менеджеры памяти EMM386.EXE из Novell DOS 7 , [10] Caldera OpenDOS и DR-DOS 7.02 и выше имеют встроенную поддержку DPMI при загрузке с этой /DPMI[=ON]
опцией. KRNL386.SYS даже имел опцию командной строки /VER=0.9|1.0
для обеспечения поддержки DPMI 1.0 или 0.9. [13] Трансляция API DOS упоминалась как «вызванное прерывание 21 из защищенного режима». Многопользовательский DOS , System Manager и REAL/32 также поддерживают DPMI.
Самым известным отдельным ядром DPMI, вероятно, является CWSDPMI ; оно поддерживает DPMI 0.9, но не имеет недокументированной "трансляции DOS API". Другой вариант, называемый PMODE, от "TRAN" он же Thomas Pytel, был популярен среди 32-битных программистов во время демонстрационной сцены 1990-х годов. Многие игры использовали DOS/4GW, который был разработан Rational Systems как подмножество DOS/4G и распространялся с компилятором Watcom C.
HDPMI (часть HX DOS Extender ) обеспечивает «трансляцию DOS API» и почти полную реализацию DPMI 1.0.
Комитет DPMI 1.0 заседал в период с 1990 по 1991 год и состоял из 12 групп:
[…] Создатели VCPI хорошо знали о его ограничениях и уже усердно работали над спецификацией второго поколения под названием Extended VCPI ( XVCPI ), когда Microsoft ворвалась на сцену с бета-версиями Windows 3.0 и ее DPMI. В течение нескольких месяцев казалось, что молодой рынок расширителей DOS разделится на два взаимоисключающих направления […] Microsoft передала контроль над спецификацией DPMI отраслевому комитету с открытым членством, и сторонники усилий XVCPI решили объединить усилия ради DPMI. […] Microsoft согласилась удалить части DPMI, которые перешли на территорию DOS-расширения — в частности, прямую поддержку прерываний DOS и ROM BIOS в защищенном режиме . Следовательно, DPMI, версия 0.9, первая публичная версия, выпущенная Комитетом DPMI в мае 1990 года, определяет только низкоуровневые или стандартные функции […] Естественно, высокоуровневый или интерфейс расширения DOS Windows 3.0 все еще существует, но он отступил в сумеречную зону недокументированной функциональности. Недокументированный, но вряд ли неиспользуемый […]
[…] [Ральф Липе:] Я думаю, они проверены в проекте
Win386
. В корне MSDOS.DOC (посмотрите на все файлы .DOC в корне) […] НЕТ! Это чрезвычайно деликатный вопрос, поскольку он в основном сообщает […]
ISV
(AKA
DR-DOS
и
IBM
), как запускать стандартный режим
Windows
. Вам нужно очистить его с помощью
BradSi[lverberg]
перед его распространением. [Грег Лоуни:] SoftNet делает
limulator
. Они прочитали в руководстве
C7
, что вы можете запустить C7 dos-extended, если ваш limulator поддерживает расширения MS-DOS для спецификации DPMI. Поэтому […] они позвонили нам, чтобы получить спецификацию о том, что именно представляют собой эти расширения. По-видимому, они не документированы. […] Они не такие уж сложные, в основном это просто то, какие вызовы MS-DOS и BIOS мы отображаем для приложения, и у Qualitas не возникло проблем с их обратным проектированием. (В бета-версии новый
386MAX
мог запускать KRNL386 из командной строки, но я считаю, что они отключили эту функцию в своем конечном продукте, чтобы не наступать нам на ноги. 386MAX, конечно, поддерживает C7.) […] Ральф, была ли спецификация распространена среди членов комитета DPMI? […] [Дэйв Коул:] Мы ни в коем случае НЕ должны это документировать. […]
Первоначальный прототип DPMI был разработан Microsoft для Windows версии 3.0 при участии Lotus Corporation и Rational Systems в рамках общих усилий по повышению производительности Windows за счет возможности запуска ядра Windows в расширенной памяти. Параллельно Intel работала с производителями многозадачных сред, эмуляторов EMS и расширителей DOS, чтобы гарантировать, что расширенная спецификация VCPI сможет полностью использовать функции виртуализации и защиты 80386. В феврале 1990 года стороны, вовлеченные в вышеуказанные мероприятия, договорились сформировать Комитет DPMI и сформулировать общеотраслевой стандарт для приложений DOS защищенного режима. Комитет выпустил первую публичную спецификацию DPMI версии 0.9 в мае 1990 года.