Возможно ли запустить 16-битный код в операционной системе, поддерживающей режим Intel IA-32e?

в руководстве по архитектуре Intel 64 & IA-32 vol 3A, Глава 9 Управление процессорами и инициализация, я нашел следующее:

выполнение режима совместимости выбирается на основе сегмента кода. Этот режим позволяет устаревшим приложениям сосуществовать с 64-разрядными приложениями, работающими в 64-разрядном режиме. Операционная система, работающая в режиме IA-32e, может выполнять существующие 16-разрядные и 32-разрядные приложения, очищая CS их дескриптора сегмента кода.Я чуток 0.

означает ли это, что устаревшее 16-разрядное и 32-разрядное приложение может сосуществовать с 64-разрядным приложением в операционной системе, работающей в режиме IA-32e.

но, как я знаю, устаревший 16-битный код обычно не поддерживается 64-битной операционной системой. Если он поддерживается, как я могу запустить 16-разрядное приложение?

3 ответов


причина, по которой windows 64-разрядная не поддерживает 16-разрядные приложения, не в том, что 64-разрядный режим не может запускать 16-разрядные инструкции.

основная причина в том, что дескрипторы имеют 32 значимых бита на 64-битных Windows. Следовательно,ручки не могут быть усечены и передается в 16-битные приложения без потери данных.

http://msdn.microsoft.com/en-us/library/aa384249%28VS.85%29.aspx


32-битное приложение поддерживается 64-битной архитектурой, поэтому они могут сосуществовать, в отношении 16-битного приложения вам нужны некоторые инструменты для эмуляции адресного пространства shuch как dosbox в windows


под 64-битным ядром,16-бит защищенного режима пользовательское пространство доступно, но виртуальный режим-8086-нет.

большинство 16-битных программ написано для DOS и ожидает запуска в реальном режиме. режим vm86 (virtual-8086) - это в основном аппаратная виртуализация для реального режима, позволяющая гостю использовать cli / sti не влияя на реальный бит IF в EFLAGS, например.

в 16-битном защищенном режиме cli будет работать только если IO уровень привилегий был 0 (например, ring 0), и он отключил бы прерывания на этом фактическом ядре процессора, а не только внутри 16-битной эмулированной среды. таким образом, это не полезно для запуска 16-битных программ DOS под современной ОС.

так что да, вы can запустите 16-битный код пользовательского пространства под 64-битным ядром, но только в 16-битном защищенном режиме, который никто никогда не использует (AFAIK). Я не думаю, что Linux изначально поддерживает 16-битные процессы, хотя, возможно, вы могли бы создать пользовательский 16-разрядный сегмент кода с modify_ldt системный вызов, и jmp far к нему.


возможно, можно было бы создать систему виртуализации программного обеспечения, которая использовала 16-битный защищенный режим для запуска 16-битных гостей DOS, захватывая ядро/гипервизор, когда гость выполнял инструкции, такие как cli. Ответ @Lưu Vúnh Phúc-одна из причин, по которой MS не пыталась это сделать.

программное обеспечение-виртуализация x86 нетривиальна, хотя, потому что некоторые инструкции, которые вам нужны подражать (как pushf) на самом деле не ловушка. Гость может заметить (или сломать из-за) флаг с поддержкой прерываний (IF) в pushf результат, не соответствующий cli Он просто убежал.


даже самые медленные процессоры x86-64 достаточно быстры для запуска программного обеспечения, такого как DOSBOX, которое полностью эмулирует ПК x86 с непосредственно доступным старым оборудованием, поэтому не было большого спроса на возможность запуска 16-битного кода изначально или большого спроса на его запуск таким образом, чтобы он выглядел " родным", т. е. возможность запуска других программ под основной ОС, а не только внутри эмулируемой среды.

видимо был патч Linux (последнее обновление в 2008 году) запустить vm86 под 64-битным ядром, возможно, временно переключив ядро в защищенный режим? Или просто запустить эмуляцию программного обеспечения.