Возможно ли запустить 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-битным ядром, возможно, временно переключив ядро в защищенный режим? Или просто запустить эмуляцию программного обеспечения.