Можно ли как-то в программе Win32, но на системе Win64 исполнить фрагмент кода или хотя бы команду в 64-bit режиме? Что-то никаких префиксов или команд я не углядел. Плохо искал? Я догадываюсь, что через какие-то хаки это сделать можно, но хотелось бы по-честному. Может в Win64 есть какой-то специальный системный вызов?
Можно, никаких ограничений на это нет. То есть в 64бит системе специального 32-х нет, а есть только ограничение адресного пространства до 2 Гб. (address space sandbox), но и то это действует только на этапе компиляции. То есть чтобы прога пользовала всё адресное пространство её нужно компилить с ключом /LARGEADDRESSAWARE(для MS компиляторов), иначе она его не будет использовать. А сам можешь делать что угодно. .
Надо установить бит CS.L в 1 (21 бит в старшем DWORD регистра CS), тогда будет включен Long Mode. Для 32-разрядных приложений он установлен в 0 (Compatibility Mode)
Возможно, что мой вопрос не понят. Речь не об адресном пространстве, а о 64битности операций/регистров и доступность дополнительных регистров. Я предполагаю, что может быть какой-то системный вызов, которомы передаются набор значений регистров и адрес кода и он выполняется в 64bit режиме. Либо (что менее вероятно, т.к. я не нашел этого в документации на процессоры) есть префикс или команда, которая переключает в 64bit режим и обратно. Есть что-нибудь в этом духе?
ak217 Есть новые регистры и команды. Переключать ничего не надо. Дока по 64бит процам, и в ней этого нет? Странно. В инете точно есть .
А мне его дадут поменять? Я правильно понял, что речь идет о сегментном регистре? Неужели так просто? Или есть подвохи?
Подвохов нет, не считая того, что из 32-разрядного приложения нельзя получить доступ к 64-разрядному сегментному регистру По всей видимости, единственным способом будет инжект в 64-разрядный процесс
Не, мы друг друга не понимаем. Win32 приложение исполняется в Compatibility mode(или Legacy?), в котором все 32-х битное. Ответ Booster'а дает надежду, что это делается просто. Надо будет попробовать.
ak217 Все новые команды выполняются в Long Mode. В Compatibility Mode все команды полностью совместимы с x86, безо всяких выкрутасов
А как-нибудь в дескипторе треда в сохраненных регистрах попортить что-нибудь никак? Правда, там наверно, тоже все 32-битное... Какие еще идеи? Понятно, что можно написать какой-нибудь 64-битный COM или драйвер(сам не хочу!) и вызывать его, но хотелось бы без таких извратов. Вообще идея в том, чтобы задействовать 64битную арифметику для тяжелых вычислений (деление длинных целых чисел), если работаем на 64битном процессоре. Да и в других местах это можеть быть полезно. К сожалению, перевести все приложение на 64бит не представляется возможным даже теоретически.
У 32-битного потока в Win64 два контекста - 32-битный и 64-битный. В 32-битный контекст 64-б. дескриптор записать не получится. А 64-битный не спасет, потому что это контекст самого эмулятора. Может быть просто в отдельном процессе это делать? Или свою Dll заинжектить в 64-разрядный процесс? (хотя не 100%, что получится)
Для этой цели проще создать отдельное 64-битное приложение, и связать его с 32-битным с помощью, например, отображения одной страницы памяти (файловый мэппинг), и event'ов. Пишешь все параметры в эту страницу, вызываешь PulsEvent, и ждешь это же событие, пока его вызовет 64-битный процесс. Он вычисляет, записывает результат, и вызывает событие. Все должно работать.
Помню ой! когда вышел Win95, всех заботило как они из 16-ти битного ДОС'а могут достучаться до 32-битной ОС Недостучались, и слава с0тоне. Как нистранно, в 64 -> 32 нет никой эмуляции в отличие от 32 -> 16, отдельные 32битные процессы, без понтов и все прекрасно работает и шарится.
Кстати вопрос на засыпку, какое будет исключение, если я на 64-битной машине попробую выполнить коммманду inc eax?
Dr.Golova Если процессор в 64х битном режиме, то коды 4X это REX-префикс. А inc eax можно закодировать как FF C0 и никакого исключения при выполнениии этой команды не будет, если перед ней нету префикса lock, её длина со всеми префиксами не более 15 байт и страницы её содержащие доступны для чтения. An instruction can have only one REX prefix, although the prefix can express several extension features. If a REX prefix is used, it must immediately precede the first opcode byte in the instruction format. Any other placement of a REX prefix, or any use of a REX prefix in an instruction that does not access an extended register, is ignored. The legacy instruction-size limit of 15 bytes still applies to instructions that contain a REX prefix.
Этак я и сам умею, я не об этом спрашиваю. В таком уж случае проще создать COM приложение и синхронизацию оставить на совести системы. Но хотелось бы сделать все в пределах одного приложения, в моем случае - в пределах сервиса.