А можно ли без извратов временно перейти в 64-bit режим?

Тема в разделе "WASM.WIN32", создана пользователем ak217, 27 ноя 2006.

  1. ak217

    ak217 New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    25
    Можно ли как-то в программе Win32, но на системе Win64 исполнить фрагмент кода или хотя бы команду в 64-bit режиме? Что-то никаких префиксов или команд я не углядел. Плохо искал?
    Я догадываюсь, что через какие-то хаки это сделать можно, но хотелось бы по-честному. Может в Win64 есть какой-то специальный системный вызов?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Можно, никаких ограничений на это нет. То есть в 64бит системе специального 32-х нет, а есть только ограничение адресного пространства до 2 Гб. (address space sandbox), но и то это действует только на этапе компиляции. То есть чтобы прога пользовала всё адресное пространство её нужно компилить с ключом /LARGEADDRESSAWARE(для MS компиляторов), иначе она его не будет использовать. А сам можешь делать что угодно. :).
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Надо установить бит CS.L в 1 (21 бит в старшем DWORD регистра CS), тогда будет включен Long Mode. Для 32-разрядных приложений он установлен в 0 (Compatibility Mode)
     
  4. ak217

    ak217 New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    25
    Возможно, что мой вопрос не понят.
    Речь не об адресном пространстве, а о 64битности операций/регистров и доступность дополнительных регистров.
    Я предполагаю, что может быть какой-то системный вызов, которомы передаются набор значений регистров и адрес кода и он выполняется в 64bit режиме. Либо (что менее вероятно, т.к. я не нашел этого в документации на процессоры) есть префикс или команда, которая переключает в 64bit режим и обратно.
    Есть что-нибудь в этом духе?
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    ak217
    Есть новые регистры и команды. Переключать ничего не надо. Дока по 64бит процам, и в ней этого нет? Странно. В инете точно есть :).
     
  6. ak217

    ak217 New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    25
    А мне его дадут поменять?
    Я правильно понял, что речь идет о сегментном регистре? Неужели так просто? Или есть подвохи?
     
  7. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Подвохов нет, не считая того, что из 32-разрядного приложения нельзя получить доступ к 64-разрядному сегментному регистру :)
    По всей видимости, единственным способом будет инжект в 64-разрядный процесс
     
  8. ak217

    ak217 New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    25
    Не, мы друг друга не понимаем. Win32 приложение исполняется в Compatibility mode(или Legacy?), в котором все 32-х битное.
    Ответ Booster'а дает надежду, что это делается просто. Надо будет попробовать.
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    ak217
    Все новые команды выполняются в Long Mode. В Compatibility Mode все команды полностью совместимы с x86, безо всяких выкрутасов
     
  10. ak217

    ak217 New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    25
    А как-нибудь в дескипторе треда в сохраненных регистрах попортить что-нибудь никак? Правда, там наверно, тоже все 32-битное...
    Какие еще идеи?
    Понятно, что можно написать какой-нибудь 64-битный COM или драйвер(сам не хочу!) и вызывать его, но хотелось бы без таких извратов.
    Вообще идея в том, чтобы задействовать 64битную арифметику для тяжелых вычислений (деление длинных целых чисел), если работаем на 64битном процессоре. Да и в других местах это можеть быть полезно.
    К сожалению, перевести все приложение на 64бит не представляется возможным даже теоретически.
     
  11. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    У 32-битного потока в Win64 два контекста - 32-битный и 64-битный. В 32-битный контекст 64-б. дескриптор записать не получится. А 64-битный не спасет, потому что это контекст самого эмулятора.

    Может быть просто в отдельном процессе это делать? Или свою Dll заинжектить в 64-разрядный процесс? (хотя не 100%, что получится)
     
  12. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Для этой цели проще создать отдельное 64-битное приложение, и связать его с 32-битным с помощью, например, отображения одной страницы памяти (файловый мэппинг), и event'ов. Пишешь все параметры в эту страницу, вызываешь PulsEvent, и ждешь это же событие, пока его вызовет 64-битный процесс. Он вычисляет, записывает результат, и вызывает событие. Все должно работать.
     
  13. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Помню ой! когда вышел Win95, всех заботило как они из 16-ти битного ДОС'а могут достучаться до 32-битной ОС
    Недостучались, и слава с0тоне. Как нистранно, в 64 -> 32 нет никой эмуляции в отличие от 32 -> 16, отдельные 32битные процессы, без понтов и все прекрасно работает и шарится.
     
  14. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Кстати вопрос на засыпку, какое будет исключение, если я на 64-битной машине попробую выполнить коммманду inc eax? :)
     
  15. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    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.
     
  16. ak217

    ak217 New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    25
    Этак я и сам умею, я не об этом спрашиваю. В таком уж случае проще создать COM приложение и синхронизацию оставить на совести системы.
    Но хотелось бы сделать все в пределах одного приложения, в моем случае - в пределах сервиса.