Облегченный способ использования инструкций Amd64 под 32-битной Windows? - PullRequest
6 голосов
/ 20 августа 2011

Для некоторого связанного с ЦП кода, использующего 64-битные переменные, выгодно использовать набор команд Amd64, а не x86.Как это можно сделать под 32-битной Windows (например, Windows XP SP3)?Конечно, я предполагаю современный процессор с поддержкой Amd64.Я исключаю работающий, но тяжеловесный метод: запуск полноценной 64-битной ОС в качестве виртуальной машины, например, Ubuntu для Amd64 под Virtualbox.

Я понимаю, что необходима некоторая сборка, и в ней будут ограниченияВ частности, адресация больше памяти, чем 32-битная Windows управляет.Но я думаю о чисто вычислительных задачах, требующих лишь умеренного объема памяти и не вызывающих внешние функции.

Ответы [ 2 ]

9 голосов
/ 20 августа 2011

Невозможно использовать инструкции Amd64 (длинный режим) в 32-разрядной ОС общего назначения (без модификации ядра / специальных драйверов / гипервизора).

Это потому, что:

1) для использования родных 64-битных инструкций необходимо переключиться в длинный режим.Это привилегированное действие.Ядро 32-битной ОС не может продолжать работать, если процессор переключен в 64-битный режим, поэтому вам следует переключиться обратно перед входом в ядро ​​

2) Но ядро ​​часто вызывается асинхронно для таймера (планировщик)) и другие аппаратные прерывания (драйверы).Он не сохранит 64-битные регистры и не изменит режим с длинного на защищенный.

Возможно, можно написать специальный драйвер, который будет выполнять 64-битные задачи на 32-битной ОС, но такой драйвербольше похоже на 64-битное ядро ​​и динамический патчер ядра.Я не знаю ни одного такого решения.

Вы можете использовать только MMX, SSE, SSE2, SSE3, AVX для доступа к 64-битному ALU и регистрам вашего ЦП при работе в 32-битной ОС.

Я могу сказать, что Linux, некоторые BSD, Mac OS X имеют режим, когда используется 64-битное ядро, но программное обеспечение пользовательского пространства является 32-битным.В таком случае можно будет запускать как 32-разрядные, так и 64-разрядные приложения, поскольку ядро ​​знает о 64-разрядном режиме и может обращаться к 64-разрядным регистрам для переключения задач.Насколько я знаю, MS Windows не имеет такого режима (W7 эмулирует 32-битный режим, но это называется мой MS в качестве симулятора, поэтому я предполагаю, что это не встроенная функция ядра).

Другая возможность (это лучше, если ваш процессор поддерживает аппаратную виртуализацию) - это использовать 64-разрядный гипервизор (VMware / Xen, другие решения с завышенной ценой) с 32-разрядными и 64-разрядными гостевыми ОС.VirtualBox - это еще один вариант использования гипервизора, который можно использовать бесплатно.

1 голос
/ 20 августа 2011

Как правило, выполнение 64-битного кода в ядре 32-битной ОС будет практически невозможным по следующим причинам:

  • 32-битная ОС не знает о дополнительных 64-битных регистрах (и старших 32-битных существующих регистрах) и не будет сохранять их при переключении задач
  • 32-разрядная ОС не готова к выполнению 64-разрядного кода. Включение выполнения 64-битного кода означает переключение на пейджинг IA-32e (который требует совершенно другого формата таблицы страниц) и установку CS.L = 1 и CS.D = 0 в дескрипторе сегмента кода в GDT (или LDT). (См. Руководства IA-32, том 3a / 3b 5.2.1)

В принципе, вы можете обойти обе проблемы, написав новый HAL для Windows, который работает в режиме IA-32e и переключается на 64-битный сегмент кода батута для сохранения и восстановления 64-битных регистров. Это довольно сложная задача; взгляните на Windows DDK для деталей. Вы также можете использовать подход эмуляции, как VirtualBox и его друзья, если ваш процессор поддерживает VMX. Но было бы намного проще просто использовать 64-битную ОС с самого начала.

...